Krótka odpowiedź : Wyślij SIGTERM
, 30 sekund później SIGKILL
. To znaczy, wyślij SIGTERM
, poczekaj trochę (może się to różnić w zależności od programu, możesz lepiej poznać swój system, ale wystarczy 5 do 30 sekund. Podczas wyłączania maszyny możesz zobaczyć, że automatycznie czeka do 1'30 s. Po co się w końcu spieszyć?), A potem wysłać SIGKILL
.
Rozsądna odpowiedź : SIGTERM
, SIGINT
, SIGKILL
To jest więcej niż wystarczająco. Proces ten będzie bardzo prawdopodobnie zakończyć przed SIGKILL
.
Długa odpowiedź : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
,SIGKILL
Nie jest to konieczne, ale przynajmniej nie wprowadzasz w błąd procesu dotyczącego wiadomości. Wszystkie te sygnały nie znaczy, że chcą, aby zatrzymać proces, co robi i wyjść.
Bez względu na to, jaką odpowiedź wybierzesz z tego wyjaśnienia, miej to na uwadze!
Jeśli wyślesz sygnał, który oznacza coś innego, proces może obsłużyć to na bardzo różne sposoby (z jednej strony). Z drugiej strony, jeśli proces nie obsłuży sygnału, nie ma znaczenia, co wyślesz, mimo wszystko proces zakończy się (jeśli domyślną akcją jest oczywiście zakończenie).
Musisz więc myśleć jak programista. Czy zakodowałbyś program obsługi funkcji, aby, powiedzmy, SIGHUP
zamknąć program, który się z czymś łączy, czy też zapętliłbyś go, aby spróbować połączyć się ponownie? Oto główne pytanie! Dlatego ważne jest, aby po prostu wysyłać sygnały, które oznaczają to, co zamierzasz.
Prawie głupia długa odpowiedź :
Poniższa tabela zawiera odpowiednie sygnały i domyślne działania na wypadek, gdyby program ich nie obsłużył.
Zamówiłem je w kolejności, w której proponuję użyć (przy okazji proponuję użyć rozsądnej odpowiedzi , nie tej tutaj), jeśli naprawdę potrzebujesz wypróbować je wszystkie (fajnie byłoby powiedzieć, że stół jest uporządkowany pod względem zniszczenia, jakie mogą spowodować, ale tak nie jest końca prawdą).
Sygnały oznaczone gwiazdką (*) NIE są zalecane. Ważną rzeczą jest to, że możesz nigdy nie wiedzieć, do czego jest zaprogramowany. Specjalnie SIGUSR
! Może rozpocząć apokalipsę (jest to darmowy sygnał dla programisty, który robi, co chce!). Ale jeśli nie jest obsługiwane LUB w mało prawdopodobnym przypadku zakończenia, program zakończy działanie.
W tabeli sygnały z domyślnymi opcjami zakończenia i generowania zrzutu pamięci są pozostawione na końcu, tuż przed SIGKILL
.
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
Następnie chciałbym zaproponować w tym prawie głupiego długa odpowiedź :
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGQUIT
, SIGABRT
,SIGKILL
I wreszcie
Zdecydowanie głupia długa odpowiedź :
Nie próbuj tego w domu.
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, SIGQUIT
, SIGABRT
, SIGSEGV
, SIGILL
, SIGFPE
I jeśli nic nie działało, SIGKILL
.
SIGUSR2
powinien być wypróbowany wcześniej, SIGUSR1
ponieważ lepiej będzie, jeśli program nie obsługuje sygnału. I jest dużo bardziej prawdopodobne, że poradzi sobie z tym, SIGUSR1
jeśli obsługuje tylko jedną z nich.
BTW, KILL : wysyłanie SIGKILL
do procesu nie jest złe , jak stwierdziła inna odpowiedź. Zastanów się, co się stanie, gdy wyślesz shutdown
polecenie? Spróbuje SIGTERM
i SIGKILL
tylko. Jak myślisz, dlaczego tak jest? A dlaczego potrzebujesz innych sygnałów, skoro sama shutdown
komenda używa tylko tych dwóch?
Wracając do długiej odpowiedzi , oto fajny oneliner:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
Śpi przez 30 sekund między sygnałami. Po co jeszcze miałbyś potrzebować onelinera ? ;)
Zalecane również: wypróbuj tylko sygnały 15 2 9
z rozsądnej odpowiedzi .
bezpieczeństwo : zdejmij drugą, echo
gdy jesteś gotowy do pracy. Nazywam to moim dry-run
dla onlinerów . Zawsze używaj go do testowania.
Skrypt zabija z wdziękiem
Właściwie to tak mnie zaintrygowało to pytanie, że postanowiłem stworzyć mały skrypt, aby to zrobić. Zapraszam do pobrania (sklonowania) go tutaj:
Łącze GitHub do repozytorium Killgracefully