什么可以导致生成SIGHUP?

时间:2012-11-12 02:39:52

标签: linux ubuntu linux-kernel

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

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

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

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

2 个答案:

答案 0 :(得分:18)

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

  • screentmux
  • 中运行您的计划
  • 使用nohup或其他一些守护程序框架运行您的程序

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

答案 1 :(得分:10)

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

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

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