我们大约有40台计算机运行相同的硬件和软件。它们都运行Ubuntu 11.10。它们都只有一个用户帐户来登录。设置.profile文件以启动守护进程。守护进程的代码是用C编写的。
每隔几周,我们就会收到守护进程不再运行的报告。并不是所有的计算机都会发生这种情况,只有一两台计算机会发生这种情况。我们无法始终如一地重现这个问题。
查看代码,应用程序在收到SIGHUP或SIGTERM时退出。
据我所知,SIGHUP是在用户注销时生成的。在我们的例子中,用户永远不会注销。我想知道是否有可能SIGHUP是由于其他原因而生成的。任何其他想法都将不胜感激。
发布于 2012-11-12 11:09:53
可以使用kill实用程序或kill syscall发送信号。当然,您可以尝试找出是谁在发送该信号或断开您的终端或网络连接,但有一种更简单实用的方法来解决您的问题。
当代码应该作为守护进程运行,但实际上不是(就像您的一样)时,有一个包装器可以将任何程序转换为守护进程。令人惊讶的是,这个包装器名为daemon!它有很多选项,可能对你来说最重要的是,如果实用程序因为任何原因而死,它可以选择自动重新启动实用程序。
如果这个命令没有安装在你的Ubuntu上,只需要sudo apt-get install daemon和man daemon就可以开始了。
发布于 2012-11-12 20:26:47
关于SIGHUP,有几点需要注意。首先,它源于挂机的概念,即通过调制解调器之类的东西失去与控制台的连接。用现代的说法来说,这通常意味着它已经失去了对tty的控制。除非您已经注意与tty分离,否则在给定终端中启动的任何程序都将在终端关闭时收到SIGHUP。有关如何在您的程序中执行此操作的详细信息,请参阅here。其他选项包括:
screen中运行您的程序,或者使用nohup或其他守护框架运行您的程序
另一种可能是,某些东西故意向您的进程发送SIGHUP,按照“传统”,SIGHUP通常用于向进程发出信号,表明它应该重新读取其配置。
https://stackoverflow.com/questions/13337701
复制相似问题