当我从控制台运行程序时,例如
me@box:~$ firefox
我希望控制台记录错误消息(我认为这是 std out 还是 std err?)和程序中的其他项目,在本例中是 Firefox。
但是今天我注意到 bash 只是打开程序并进入一个新的提示,例如
me@box:~$ firefox
me@box:~$
如何从 bash 启动一个程序,以便将错误消息写入控制台?
为什么有些程序默认以这种方式运行,而其他程序(firefox)却不这样运行?
答案1
您说得对,这是一个已经运行的进程的结果,但除非 Firefox 有 bug,否则它不应该是僵尸进程。
当您启动 Firefox 时,新的 Firefox 实例会检查 Firefox 是否已在运行。如果 Firefox 已在运行,则新实例不会继续作为单独的实例运行,而是与已在运行的实例通信,并使其启动一个新窗口或新选项卡。如果将 URL 指定为新 Firefox 实例的命令行参数,它会将该 URL 传达给已在运行的实例,这样就会在已在运行的实例中启动一个窗口或选项卡,并使用您指定的 URL 打开一个页面。一旦这个新的第二个实例告诉原始的已在运行的实例要做什么,这个新实例就会终止,只剩下一个实例。
您可以通过启动第一个 Firefox 实例并使用 URL 作为命令行参数(例如firefox http://askubuntu.com/q/147059/22949
)来验证此行为,然后通过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
实际上重新启动了。如果确实发生这种情况,那就是compiz
或中的一个错误firefox
。
ps x | grep -v grep | grep firefox
如果您可以提供问题发生时的输出(即,在发现firefox
在终端中运行会立即返回到 shell 后),这将极大地帮助解决此问题。您可以编辑答案以包含此信息。您还应该说明在firefox
终端中运行时是否打开了新的 Firefox 窗口/选项卡,或者在终端中运行它是否没有效果。