2012-05-30 43 views
26

我有一个看门狗应用程序。它观察我的主应用程序可能因某种原因崩溃(我知道这是不好的,但这不是重点)。如何在不杀死Linux的情况下给应用程序发信号?

我编写了这个看门狗,接受SIGUSR1信号来停止监视我的应用程序的存在。我

kill -SIGUSR1 `pidof myapp` 

信号,它这个作品真的很好。当我尝试发出一个没有内置此功能的较旧版本的看门狗的信号时,我的问题就出现了。在这种情况下,kill信号会导致看门狗死掉(终止进程),这会导致进一步的复杂性(重新启动设备) 。

有没有办法给SIGUSR1发信号给我的看门狗,这样它就不会在这个特定信号未处理的情况下终止?

+1

“...我知道这是坏的,但这不是点“ - 你把牛奶放在我的鼻子:) +1。 – jww

回答

26

GNU docs约信号处理:

的SIGUSR1和SIGUSR2信号预留供您使用任何你想要的方式。如果您在接收信号的程序中为它们编写信号处理程序,它们对于简单的进程间通信非常有用。 有一个示例显示SIGUSR1和SIGUSR2在Signaling Another Process部分中的使用。 默认操作是终止进程

为SIGINFO默认的动作是什么也不做,所以它可能更适合:

SIGINFO:信息请求。在4.4 BSD和GNU系统中,当用户在规范模式下键入STATUS字符时,该信号被发送到控制终端的前台进程组中的所有进程;请参阅导致信号的字符一节。 如果进程是进程组的负责人,那么缺省操作是打印有关系统的某些状态信息以及进程正在执行的操作。 否则默认是不做任何事。当控制终端关闭

SIGHUP被发射,但由于大多数守护进程没有连接到末端的情况并不少见,以使用它作为“重载”:

守护程序有时使用SIGHUP作为一个信号重新启动自己,最常见的原因是重新读取已更改的配置文件。

顺便说一下,您的看门狗可能会不时读取配置文件,以了解它是否应该重新启动过程。

我个人最喜欢的一个看门狗是supervisor

$ supervisorctl start someapp 
someapp: started 

$ supervisorctl status someapp 
someapp    RUNNING pid 16583, uptime 19:16:26 

$ supervisorctl stop someapp 
someapp: stopped 

看看kill -l返回你的平台上的信号列表,并尝试了一些人,但SIGUSR1似乎是一个不错的选择。

$ kill -l 
1) SIGHUP  2) SIGINT  3) SIGQUIT  4) SIGILL  5) SIGTRAP 
6) SIGABRT  7) SIGBUS  8) SIGFPE  9) SIGKILL  10) SIGUSR1 
11) SIGSEGV  12) SIGUSR2  13) SIGPIPE  14) SIGALRM  15) SIGTERM 
16) SIGSTKFLT 17) SIGCHLD  18) SIGCONT  19) SIGSTOP  20) SIGTSTP 
21) SIGTTIN  22) SIGTTOU  23) SIGURG  24) SIGXCPU  25) SIGXFSZ 
26) SIGVTALRM 27) SIGPROF  28) SIGWINCH 29) SIGIO  30) SIGPWR 
31) SIGSYS  34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 
63) SIGRTMAX-1 64) SIGRTMAX 

[更新]

关于Linux和BSD系统之间的行为差​​异Carpetsmoker评论:

SIGINFO似乎libc的& BSD上工作GNU不同;在BSD上,它的工作原理与你描述的一样,但在Linux上它不存在,或者与SIGPWR一样... GNU libc手册在这方面似乎不正确(你的kill -l输出也不显示SIGINFO )...我不知道为什么GNU不支持它,因为我觉得它非常有用...... - Carpetsmoker

+2

'SIGINFO'似乎在BSD上的GNU libc & BSD;上有所不同,它的工作原理与您描述的一样,但在Linux上,它或者不存在,或者与'SIGPWR'相同...... GNU libc手册似乎不正确这方面(你的'kill -l'输出也不会显示'SIGINFO')......我不知道GNU为什么不支持它,因为我觉得它非常有用...... – Carpetsmoker

3

接收到SIGUSR1时的默认操作是在处理程序不存在时终止。意思是你不能再用那个信号做你想要的。

缺少更新看门狗,没有什么可以做的(我假设在发送信号之前无法区分程序内的看门狗版本)。

相关问题