Как мне поймать сигнал "УБИТЬ", "HUP" или "Прервать пользователя"?


У меня есть скрипт, работающий на фоне моего сервера Linux, и я хотел бы перехватывать сигналы, такие как перезагрузка или что-нибудь, что убило бы этот скрипт, и вместо этого сохранить любую важную информацию перед фактическим выходом.

Я думаю, что большая часть того, что мне нужно поймать, это SIGINT, SIGTERM, SIGHUP, SIGKILL.

Как поймать любой из этих сигналов и заставить его выполнить функцию выхода, в противном случае продолжайте выполнять все, что он делал ?

Псевдо-перл код:

#!/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);
}
?>
Author: Prix, 2011-10-23

3 answers

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.
 15
Author: mu is too short, 2011-10-23 05:27:35

Perl:

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

SIGKILL не может быть пойман. Он не отправляется в процесс.

%SIG задокументирован в perlvar. См. также perlipc

 5
Author: ikegami, 2011-10-23 04:49:17

Для версии perl см. perldoc -q signal - в основном, установите $SIG{signal} в дополнительную ссылку.

 1
Author: Jim Davis, 2011-10-23 04:41:55