Как поймать сигнал KILL или HUP или пользовательский прерывание?

У меня есть сценарий, работающий на фоне моего 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); } 

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 использует 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. 

Perl:

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

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

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

Для версии perl см. perldoc -q signal – в основном, установите $SIG{signal} в подзадачу.