如何在没有在Linux中杀死它信号的应用程序?(How to signal an applicati

2019-07-29 16:09发布

我有一个看门狗应用。 这手表我可能崩溃的一个原因或其他原因(我知道这是不好的,但是这不是重点)主要的应用程序。

我编程这个看门狗接受SIGUSR1信号停止监视我的应用程序的存在。 I信号与它

kill -SIGUSR1 `pidof myapp`

这个作品真的很好。 我的问题是当我尝试信号,它不具有此功能内置看门狗的旧版本。在这种情况下,杀信号杀死看门狗(终止进程),从而导致进一步的并发症(重新启动设备) 。

有没有一种方法对信号我的SIGUSR1看门狗所以它不会终止,如果这个特定的信号是未经处理的?

Answer 1:

从GNU文档有关的信号处理:

该SIGUSR1和SIGUSR2信号预留供您使用任何你想要的方式。 他们是简单的进程间通信有用的,如果你在接收信号的节目为他们写的信号处理程序。 有表示部的信令的另一方法中的用途和SIGUSR1 SIGUSR2的一个例子。 缺省行为是终止进程

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

SIGINFO:信息请求。 在4.4 BSD和GNU系统,该信号被发送到控制终端的前台进程组中的所有过程,当用户类型规范模式中的状态特性; 看到因的信号部分的字符。 如果处理是处理小组的领导,默认操作是打印系统信息和该进程在做一些状态信息。 否则,默认是什么也不做

SIGHUP当控制终端关闭时发出,但由于大多数守护进程没有连接到末端的情况并不少见,以使用它作为“重新加载”:

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

顺便说一句,你的看门狗也会为了读取时间的一个配置文件,以时间来知道它是否应该重新启动的过程。

我对看门狗个人最喜欢的是主管 。

$ 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

[UPDATE]

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

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



Answer 2:

收到SIGUSR1时,默认行为是终止,如果处理不存在。 这意味着你不能做你想做的与信号了。

短更新看门狗,有什么可以做(和我假设你是无法从程序中发送信号之前区分看门狗版本)。



文章来源: How to signal an application without killing it in Linux?
标签: linux signals