2011-10-23 15 views
8

Mam skrypt działający w tle mojego serwera linuksowego i chciałbym przechwycić sygnały takie jak restart lub cokolwiek, co zabiłoby ten skrypt i zamiast tego zapisz wszystkie ważne informacje zanim faktycznie wyjdę.Jak złapać sygnał KILL, HUP lub przerwania przez użytkownika?

Myślę, że większość tego, co potrzebuję złapać, to SIGINT, SIGTERM, SIGHUP, SIGKILL.

Jak złapać którykolwiek z tych sygnałów i zlecić wykonanie funkcji wyjścia, w przeciwnym razie należy wykonać to, co robił?

pseudo kod 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 kod 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); 
} 
?> 
+0

http://stackoverflow.com/questions/5180539/quick-perl-sigint-handler – daxim

Odpowiedz

15

PHP używa pcntl_signal zarejestrować obsługi sygnału, więc coś takiego:

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. 
+0

wypróbuje to, dzięki ... więc zasadniczo byłby przypisany do obsługi i catched nawet jeśli mam nieskończoność podczas uruchamiania gdzieś w kodzie, prawda? – Prix

+0

@Prix: Tak, to powinno się stać. Ale zwróć uwagę na notatki ikegami na temat SIGKILL i przeczytaj dokumentację (http://php.net/manual/en/function.pcntl-signal.php), aby uzyskać więcej informacji. –

+0

'# Tylko na pokaz, nie złapiesz tego." Nie tylko to, ale nadal otrzymujesz komunikat ostrzegawczy o tym podczas uruchamiania kodu. Odpoczynek działa całkiem nieźle dzięki. – Prix

1

Dla wersji Perl, zobaczyć perldoc -q signal - zasadniczo ustawiony $SIG{signal} do odniesienia sub.

+1

'perlvar' perldoc będzie kolejnym dobrym odniesienia: http://perldoc.perl.org/perlvar.html# % 25SIG –

+0

Oh, racja. Zupełnie na tym polegałem. –

+0

'perldoc -q signal' nie mówi mi, żebym chciał wiedzieć, jak wyliczone są opcje, i jako taka twoja odpowiedź nie pomoże mi, ale dzięki. @mu jest za krótki Opublikowany link referencyjny jest świetny, pokazuje wszystko, czego wyżej nie ma. – Prix

5

Perl:

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

SIGKILL nie można złapać. Nie jest wysyłany do procesu.

%SIG jest udokumentowane w perlvar. Zobacz także perlipc

+0

Wydaje się być dobrym, ale czy 'kill -9 pid' ma wartość INT lub SIGKILL? Używam głównie kill -HUP, aby zakończyć proces iz tego, co wiem, restartuje się sygnał TERM, ale chciałbym być bezpieczny przed wszystkimi, którzy próbują go zabić. – Prix

+3

@Prix: 9 to SIGKILL. Wypróbuj 'kill -l', jeśli używasz bash, które da ci listę sygnałów wraz z ich numerami. Ctrl + C to SIGINT. –

Powiązane problemy