Perl - перехват и обработка сигналов


SIGTERM

Небольшой пример того как обработывать сигнал выключение/перезагрузки сервера

Скрипт который пишет в файлик раз в секунду(имитация работающего демона)


#!/usr/local/bin/perl

while ( 1 ){
    open my $fh, '>', '/home/orlov/tmp/test' or die "Can't open /home/orlov/tmp/test: $!";
    print $fh "1\n";
    close $fh;
    sleep 1;
}

exit;

Добавляем обработку сигнала


...

$SIG{TERM} = sub {
    open my $fh, '>', '/home/orlov/tmp/test' or die "Can't open /home/orlov/tmp/test: $!";
    print $fh "Server is shutdown!\n";
    close $fh;
    die;
}

Проверяем


$ perl rollback-if-reboot-server.pl

$ tail -f /home/orlov/tmp/test
1
1
1


$ ps aux | grep perl
orlov 36681  0,0  0,0 35612 7300  1  S+J  13:34   0:00,03 perl rollback-if-reboot-server.pl
orlov 36698  0,0  0,0 18840 2528  3  S+J  13:34   0:00,00 grep perl

$ kill -15 36681

$ tail -f /home/orlov/tmp/test
1
1
Server is shutdown!

Работает! Теперь проверим в боевых условиях

Добавляем в начало скрипта запуск только одного процесса


my $wpc = `ps axww | grep rollback-if-reboot-server.pl | grep -v grep | wc`;
$wpc =~ m/^\s*(\d+)/;
die if ( $1 > 1 );

Добавим скрипт в крон


cat /etc/crontab
*/1 * * * * orlov /usr/local/bin/perl /home/orlov/projects/script/rollback-if-reboot-server.pl 1>/dev/null

Почистим тестовый лог


> /home/orlov/tmp/test

Ребутаем сервер


sudo shutdown -r now

После того как сервер поднимется, получаем заветное сообщение


$ tail -f tmp/test
Server is shutdown!