我们有大约40台运行相同硬件和软件的计算机。他们都运行Ubuntu 11.10。它们都只有一个用户帐户才能登录。.profile文件设置为启动守护程序进程。守护进程的代码用C语言编写。
几周后,我们会收到一份报告,告知守护程序不再运行。这不会发生在所有计算机上,只会发生一两个。我们无法一致地重现这个问题。
查看代码,应用程序在收到SIGHUP或SIGTERM时退出。
据我了解,当用户注销时会生成SIGHUP。在我们的例子中,用户从不注销。我想知道是否有可能因为其他原因而生成SIGHUP。任何其他想法将不胜感激。
答案 0 :(得分:18)
嗯,关于SIGHUP有几点需要注意。首先,它的起源是挂机的概念,即通过调制解调器之类的东西失去与控制台的连接。用现代的说法,这通常意味着它失去了控制权。除非您已经注意从您的tty分离,否则在终端关闭时,在给定终端中启动的任何程序都将收到SIGHUP。有关如何在您的计划中执行此操作的详细信息,请参阅here。其他选项包括:
screen
或tmux
nohup
或其他一些守护程序框架运行您的程序另一种可能性是故意向您的进程发送一个SIGHUP,其中“传统”通常用于表示应该重新读取其配置的进程。
答案 1 :(得分:10)
可以使用kill
实用程序或kill syscall发送信号。
当然,您可以尝试找出谁发送该信号或断开您的终端或网络连接,但有更简单实用的方法来解决您的问题。
当代码应该作为守护进程运行时,但实际上不是(就像你的那样),有一个包装器可以将任何程序变成守护进程。惊喜 - 这个包装被称为daemon
!它有很多选项,可能是最重要的选择,如果因任何原因死亡,它会自动重启你的实用程序。
如果您的Ubuntu上没有安装此命令,只需sudo apt-get install daemon
和man daemon
即可开始使用。