Dan*_*man 3 command-line firefox bash console process
当我从控制台运行程序时,例如
me@box:~$ firefox
Run Code Online (Sandbox Code Playgroud)
我希望控制台记录错误消息(我认为这是 std out 或 std err?)以及程序中的其他项目,在这种情况下为 firefox。
但是今天我注意到 bash 只是打开程序并进入一个新的提示,例如
me@box:~$ firefox
me@box:~$
Run Code Online (Sandbox Code Playgroud)
如何从 bash 启动程序以便将错误消息写入控制台?
为什么默认情况下某些程序以这种方式运行而其他程序(firefox)不这样做?
您是正确的,这是一个已经在运行的进程的结果,但除非 Firefox 中存在错误,否则它不应该是僵尸进程的结果。
当您启动 Firefox 时,新的 Firefox 实例会检查 Firefox 是否已经在运行。如果 Firefox 已经在运行,那么新的实例不会作为一个单独的实例继续运行,而是与已经运行的实例进行通信,并使其启动一个新窗口或一个新选项卡。如果一个 URL 被指定为新的 Firefox 实例的命令行参数,它会将该 URL 传递给已经运行的实例,因此会在已经运行的实例中启动一个窗口或选项卡,打开一个包含该 URL 的页面你指定的。一旦这个非常新的第二个实例告诉原来已经在运行的实例要做什么,这个非常新的实例就会终止,只留下一个实例。
您可以通过使用 URL 作为命令行参数(例如firefox http://askubuntu.com/q/147059/22949)启动第一个 Firefox 实例来验证此行为,然后通过firefox使用不同的 URL(例如 firefox http://www.google.com)再次运行命令来创建新窗口/选项卡。当您使用 来检查正在运行的进程时ps x,您将看到唯一正在运行的firefox实例将第一个 URL 作为其命令行参数(因为第二个命令不再运行)。
人们常说一次不能运行多个 Firefox 实例。更准确地说,您一次不能运行多个 Firefox 实例,时间不能超过一秒。
由于这种行为,当您从 shell 中调用 Firefox 的第二个实例时,该实例几乎立即终止,为您提供另一个 shell 提示,就像任何已完成执行的程序一样。
Ubuntu 中另一个常用的程序是 Nautilus(文件浏览器)。
Firefox 可能正在运行但没有显示任何窗口,但通常在退出所有 Firefox 窗口后只能在短时间内发生,除非存在错误。这可能就是您firefox在终端中跑步时发生的情况。
但是,如果 Firefox 已终止但尚未从进程表中删除(这就是僵尸进程/失效进程的含义,我认为这就是您所说的“幽灵进程”),一个非常新的实例Firefox 应该能够识别出这一点并表现得好像它是 Firefox 的唯一运行实例(因为它是)。如果您发现这没有发生,那么您应该将此行为报告为Ubuntu 中的 firefox 包中的错误(如果您使用的是 Firefox 的上游发行版而不是官方 Ubuntu 包的版本,则应报告上游的 Firefox)。
我不知道你愿意付出多少努力来弄清楚发生了什么,但是窗口管理器 ( compiz) 崩溃不应该导致 Firefox 窗口被隐藏,前提是compiz它实际上重新启动了。如果确实发生了这种情况,那就是compizor中的一个错误firefox。
如果您可以ps x | grep -v grep | grep firefox在问题发生时提供输出——即,在发现firefox在终端中运行后立即返回到您的 shell——这将极大地帮助解决此问题。您可以编辑答案以包含此信息。您还应该说明firefox在终端中运行时是否打开了新的 Firefox 窗口/选项卡,或者在终端中运行它是否无效。