【问题标题】:How do I catch a KILL or HUP or User Abort signal?如何捕捉 KILL 或 HUP 或用户中止信号?
【发布时间】:2011-12-13 10:36:28
【问题描述】:

我有一个在我的 linux 服务器后台运行的脚本,我想捕捉重启之类的信号或任何会杀死该脚本的信号,而是在实际退出之前保存任何重要信息。

我认为我需要捕获的大部分内容是 SIGINT、SIGTERM、SIGHUP、SIGKILL。

如何捕捉任何这些信号并让它执行退出函数,否则继续执行它正在做的任何事情?

伪perl代码:

#!/usr/bin/perl

use stricts;
use warnings;

while (true)
{
    #my happy code is running
    #my happy code will sleep for a few until its breath is back to keep running.
}

#ops I have detected an evil force trying to kill me
#let's call the safe exit.
sub safe_exit() 
{
    # save stuff
    exit(1);
}

伪php代码:

<?php

while (1)
{
    #my happy code is running
    #my happy code will sleep for a few until its breath is back to keep running.
}

#ops I have detected an evil force trying to kill me
#let's call the safe exit.

function safe_exit()
{
    # save stuff
    exit(1);
}
?>

【问题讨论】:

标签: php perl signals


【解决方案1】:

PHP 使用pcntl_signal 来注册一个信号处理程序,所以是这样的:

declare(ticks = 1);

function sig_handler($sig) {
    switch($sig) {
        case SIGINT:
        # one branch for signal...
    }
}

pcntl_signal(SIGINT,  "sig_handler");
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP,  "sig_handler");
# Nothing for SIGKILL as it won't work and trying to will give you a warning.

【讨论】:

  • 会尝试一下,谢谢......所以基本上它会被分配给处理程序并被捕获,即使我在代码中的某处运行时有一个无限,对吗?
  • @Prix:是的,这应该发生。但请注意 ikegami 关于 SIGKILL 的说明,并阅读文档 (php.net/manual/en/function.pcntl-signal.php) 了解更多信息。
  • # Just for show, you won't catch this. 不仅如此,您在运行代码时仍会收到有关它的警告消息。休息很好,谢谢。
  • @Prix:我不知道警告信息,但我很高兴听到它在那里。我会调整一下。
  • 虽然我非常喜欢 Perl 中的解决方案,但实际上我的目标是在 PHP 中执行此操作,但想知道在这两种情况下会如何,并且您对链接和一切都提供了很大的帮助,谢谢很多;),也很喜欢kill -l 不知道它。
【解决方案2】:

Perl:

$SIG{$_} = \&safe_exit for qw( INT TERM HUP );

SIGKILL 无法被捕获。它不会发送到进程。

%SIG 记录在perlvar 中。另见perlipc

【讨论】:

  • 看起来不错,但 kill -9 pid 属于 INT 还是 SIGKILL ?我主要使用 kill -HUP 来完成该过程,据我所知,重新启动会发送一个 TERM 信号,但希望能够安全地防止其他任何人试图杀死它。
  • @Prix: 9 是 SIGKILL。如果您正在使用 bash,请尝试 kill -l,这将为您提供信号列表及其编号。 Ctrl+C 是 SIGINT。
  • $SIG{$_} = \&amp;safe_exit for qw( INT TERM HUP ); ?
【解决方案3】:

对于 perl 版本,请参阅 perldoc -q signal -- 基本上,将 $SIG{signal} 设置为子引用。

【讨论】:

  • perldoc perlvar 将是另一个很好的参考:perldoc.perl.org/perlvar.html#%25SIG
  • perldoc -q signal 并没有告诉我如何知道这些选项的使用方式,因此您的回复对我没有多大帮助,但无论如何感谢。 @mu 太短您发布的参考链接很棒,确实显示了上述所有内容。
猜你喜欢
  • 1970-01-01
  • 2014-12-18
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多