How do I catch a KILL or HUP or User Abort signal?

2019-04-21 08:29发布

I have a script running on the background of my linux server and I would like to catch signals like reboot or anything that would kill this script and instead save any importante information before actually exiting.

I think most of what I need to catch is, SIGINT, SIGTERM, SIGHUP, SIGKILL.

How do catch any of these signals and have it execute an exit function otherwise keep executing whatever it was doing ?

pseudo perl code:

#!/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);
}

pseudo php code:

<?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
3条回答
干净又极端
2楼-- · 2019-04-21 08:55

PHP uses pcntl_signal to register a signal handler, so something like this:

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.
查看更多
forever°为你锁心
3楼-- · 2019-04-21 08:55

For the perl version, see perldoc -q signal -- basically, set $SIG{signal} to a sub reference.

查看更多
beautiful°
4楼-- · 2019-04-21 08:56

Perl:

@SIG{qw( INT TERM HUP )} = \&safe_exit;

SIGKILL cannot be caught. It is not sent to the process.

%SIG is documented in perlvar. See also perlipc

查看更多
登录 后发表回答