bro*_*oli 5 unix perl signals daemon
我有一个简单的Perl脚本,它只是将一行文本打印到stdout.我想要完成的是,当这个脚本运行时,如果我(或其他人)向该进程发出信号停止,我希望它捕获该信号并干净地退出.我的代码如下所示
#!/usr/bin/perl -w
$| = 1;
use sigtrap 'handler' => \&sigtrap, 'HUP', 'INT','ABRT','QUIT','TERM';
while(1){
print "Working...\n";
sleep(2);
}
sub sigtrap(){
print "Caught a signal\n";
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
虽然这在我从命令行实际命中ctrl-c时效果很好,但如果我发出一个
kill -9 <pid>
Run Code Online (Sandbox Code Playgroud)
它就死了.如何让它在退出前执行某些操作?我的一般想法是使用此框架捕获此脚本在服务器上因服务器重新启动而导致维护或故障时死亡的情况.
非常感谢提前
dol*_*men 11
信号#9(SIGKILL)无法被捕获.这就是Unix的设计方式.
但是在关闭维护时系统不发送该信号.至少你的守护进程是否正常运行.它通常会发送TERM信号(或者更确切地说是您的守护程序处理脚本所/etc/init.d
发生的信号).只有在超时后未正确关闭的进程才会收到SIGKILL.
因此,您的目标应该是正确处理TERM信号并编写包装脚本,/etc/init.d
以便在系统更改运行级别时调用.
更新:您可以将Daemon :: Control模块用于init脚本.
归档时间: |
|
查看次数: |
3706 次 |
最近记录: |