У меня есть сценарий, работающий на фоне моего 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}
в подзадачу.