27

我们有大约 40 台计算机运行相同的硬件和软件。它们都运行 Ubuntu 11.10。他们都只有一个用户帐户可以登录。.profile 文件被设置为启动一个守护进程。守护程序的代码是用 C 编写的。

几周后,我们会收到一份报告说守护程序不再运行。这不会发生在所有计算机上,而只会发生在一两台计算机上。我们无法始终如一地重现该问题。

查看代码,应用程序在收到 SIGHUP 或 SIGTERM 时退出。

据我了解,SIGHUP 是在用户注销时生成的。在我们的例子中,用户永远不会注销。我想知道是否有可能由于其他原因生成了 SIGHUP。任何其他想法将不胜感激。

4

2 回答 2

27

好吧,关于 SIGHUP 有几点需要注意。首先,它起源于挂断的概念,即通过调制解调器之类的东西失去与控制台的连接。在现代用语中,这通常意味着它已经失去了控制 tty。除非您已小心与 tty 分离,否则在给定终端中启动的任何程序都会在终端关闭时收到 SIGHUP。有关如何在您的程序中执行此操作的详细信息,请参见此处。其他选项包括:

  • 在里面运行你的程序screentmux
  • nohup使用或其他一些守护程序框架运行您的程序

另一种可能性是故意向您的进程发送 SIGHUP 信号,“传统”通常用于向进程发出信号,表明它应该重新读取其配置。

于 2012-11-12T12:26:47.100 回答
16

可以使用kill实用程序或 kill syscall 发送信号。当然,您可以尝试找出是谁在发送该信号或断开您的终端或网络连接,但有更简单实用的方法来解决您的问题。

当代码应该作为守护程序运行但实际上不是(就像您的那样)时,有一个包装器可以将任何程序变成守护程序。惊喜 - 这个包装被称为daemon!它有很多选项,可能对您来说最重要的是,如果您的实用程序因任何原因而死,它可以自动重新启动您的实用程序。

如果您的 Ubuntu 上未安装此命令,只需sudo apt-get install daemon, 和man daemon即可开始使用。

于 2012-11-12T03:09:53.010 回答