为什么 Firefox 尽管用 pkill -9 杀死了它却拒绝死掉?

为什么 Firefox 尽管用 pkill -9 杀死了它却拒绝死掉?

我发出以下命令来终止我的 Red Hat Linux 机器上的 Firefox:

[subhrcho@slc04lyo ~]$ pkill -9 -f firefox
[subhrcho@slc04lyo ~]$ 

但是,当我尝试通过应用程序 -> Internet -> Firefox 调用 Firefox 时,它显示:

Firefox 已在运行,但没有响应。要打开新窗口,您必须首先关闭现有的 Firefox 进程,或重新启动系统。

答案1

你的火狐已经死了。由于误导性错误消息 (*),您认为它仍在运行。这很可能是先前的结果kill -9

kill -9如果不是绝对必要,请勿使用。大多数时候这并不是绝对必要的。

这就是我认为在你的案例中发生的情况:

  1. 火狐浏览器正在运行。
  2. 你做到了pkill -9 -f firefox。火狐浏览器被杀了即刻(**)。因此,它没有机会从配置文件目录中删除其锁定文件。
  3. 您启动一个新的 Firefox 进程。
  4. 新的 firefox 进程看到锁定文件仍在配置文件目录中,并认为另一个 firefox 进程仍在运行。然后它拒绝以误导性错误消息启动。
  5. 您对错误消息感到困惑,并认为 Firefox 之前没有被杀死。
  6. 您一直试图杀死 Firefox,但没有效果,因为没有 Firefox 进程在运行。同时,您不断收到相同的误导性错误消息,因为锁定文件仍然存在。

如果您确定 Firefox 已被终止(使用 进行检查pgrep -fl firefox),您可以手动从配置文件目录中删除锁定文件。有关更多信息,请参阅这篇 mozillazine 文章:http://kb.mozillazine.org/Profile_in_use

(*) 该错误消息具有误导性,因为它表示另一个进程正在运行,尽管它实际上并未检查另一个进程。它只是检查锁定文件。所以错误消息只是锁定文件的一个指示符。不一定用于另一个进程。

(**) 立即被杀死,而不是在自行终止之前给予清理的机会。虽然立即被杀死后果的预期效果kill -9通常既不是用户预期的也不是用户预期的。

请继续阅读以获取有关此内容的更多详细说明。


背景资料:

Firefox 在配置文件目录中维护锁定文件。锁定文件的作用是防止两个 Firefox 实例同时访问同一个配置文件。

如果您启动 Firefox,它会首先检查锁定文件。如果没有锁定文件,那么 Firefox 将放置它自己的锁定文件并正常启动。如果已经有锁定文件,那么 Firefox 将假定该配置文件已被另一个 Firefox 实例使用,并显示一条误导性的错误消息,表明已经有一个实例在运行。

误导性的,因为 Firefox 只检查锁定文件。它不会检查是否有实际的 Firefox 进程在运行。有时没有其他 Firefox 实例在运行。只剩下锁文件了。

如果您正常关闭 Firefox(鼠标单击关闭按钮或alt+f4),它不会立即终止。相反,它将启动“关闭例程”。其中包括删除锁定文件。如果您观察进程(例如使用top),您会发现 Firefox 不会立即从进程列表中消失。

如果你kill使用 Firefox(没有-9),它不会“杀死”Firefox。相反,它发送一个信号。名为终止的信号SIGTERM;通常被理解为“立即关闭”的信号。收到信号后,Firefox 将启动上述关闭例程。

如果您按下ctrl+c终端(Firefox 从同一终端运行),它也会发送一个信号。这次是SIGINT为了中断。这在语义上与SIGTERM大多数最终用户程序相同。 Firefox 将启动关闭例程。

(旁注:程序不需要在收到这些信号后关闭。有些程序会执行一些特定的工作,然后继续运行。但这在最终用户程序中并不常见)

kill -9是不同的。如果你的kill -9火狐浏览器收不到信号。它不会启动关闭例程。相反,它就不再存在了。当场。中步。磁盘上未写入的任何内容都将丢失。相反,磁盘上的任何内容都将保留在磁盘上。锁定文件将保留在磁盘上。

火狐浏览器,被杀了即刻kill -9没有机会启动关闭例程,因此无法删除锁定文件。然后,当您再次启动 Firefox 时,它将看到锁定文件,并且会拒绝启动并显示误导性的错误消息。

这就是为什么如果不是绝对必要的话就不应该使用kill -9,而且大多数时候也不是绝对必要的。

有关为什么不kill -9阅读此问题和答案(以及评论)的更多讨论:我什么时候不应该杀死-9进程?

有关信号的更多信息:https://en.wikipedia.org/wiki/Signal_(IPC)

答案2

据我所知,firefox在执行时会创建一个名为 in 的文件lock或类似的 文件。~/.mozilla/firefox/<your_profile>/我不知道确切的行为,但有时它会阻碍您运行 Firefox 的第二个实例,或者,如果在关闭 Firefox 后未删除它,则根本无法运行单个实例。尝试删除该文件,应该会有所帮助。

答案3

根据我自己的经验,Firefox 有时可能需要一分钟(甚至更长时间)才能最终完全关闭,如系统监视器所示。我不了解 Red Hat,但是如果您有系统监视器,您可以尝试使用它来查看 Firefox 是否仍在运行,如果它再次运行,请发出终止命令。应该可以做到这一点。

答案4

尝试kill -9 `pidof firefox`并等待几秒钟。

相关内容