Kiedy próbujesz zakończyć proces na dobre, jakiej opcji „zabicia” powinieneś użyć?

26

Otrzymuję wiele mieszanych wiadomości od ludzi i zastanawiałem się, czy tak naprawdę nie ma dużej różnicy w tym, czego używasz.

kill 'x'
killall 'x'
kill -9 'x'

Oto niektóre opcje, z których dotychczas korzystałem, ale niektórzy twierdzą, że zabicie -9 to po prostu przesada, zabójstwo samo w sobie nie działa itp.

Czy ktoś ma jakąś radę na temat tego, z której należy skorzystać w najbardziej standardowym przypadku po prostu zakończenia procesu (a więc i jego stanu)?

[edytuj] Szukam, czego użyć, gdy chcesz zatrzymać wykonywanie procesu, abyś mógł uruchomić nowy, nowy od samego początku

Chuck testa
źródło
1
Zobacz także list UUK9, który przestrzega przed nadużyciami SIGKILL.
jw013
1
Aby wyświetlić listę wszystkich różnych sygnałów wraz z ich liczbą: kill -li przetłumaczyć liczbę na odpowiadającą jej nazwę, np . kill -l 9Powróci KILL.

Odpowiedzi:

24

Istnieje wiele sygnałów, których domyślnym rozwiązaniem jest zakończenie procesu. Ostatecznym sygnałem zakończenia jest SIGKILL, ponieważ nie można go obsłużyć, a proces nie ma innego wyjścia, jak śmierć. Oznacza to jednak również, że jeśli go wyślesz, proces zostanie pozbawiony możliwości oczyszczenia. Dlatego dobre maniery wymagają wysłania sygnału takiego jak SIGTERM, który można obsłużyć jako pierwszy i tylko jeśli proces nie zakończy się po pewnym czasie, wyślij go SIGKILL.

Należy zauważyć, że SIGINT i SIGQUIT nie są dobrymi kandydatami do arbitralnego zakończenia procesu. Ze względu na fakt, że można je generować z klawiatury terminala, wiele aplikacji używa ich do specjalnych celów. Na przykład interpreter Pythona używa SIGINT do generowania KeyboardInterruptwyjątku (także w interaktywnych sesjach Pythona, w których po prostu wraca do monitu), a JVM używa SIGQUIT do zrzucania śladów stosu. SIGINT i SIGQUIT pozostają skuteczne dla większości standardowych narzędzi wiersza poleceń, takich jak findlub cat.

Podczas zamykania systemu większość systemów UNIX i Linux wysyła SIGTERM do wszystkich procesów, po czym następuje 5 sekund oczekiwania, a następnie SIGKILL. Jest to zalecany sposób bezpiecznego zamknięcia dowolnego procesu.

Zauważ również, że nawet SIGKILL może nie zakończyć procesu utknięcia w nieprzerwanym oczekiwaniu, aż proces się obudzi.

Adam Zalcman
źródło
1
Doskonała odpowiedź. Czy masz odniesienie do kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;rekomendacji?
l0b0
+1 rodzaj odpowiedzi. A co z SIGHUP?
Alois Mahdal
2
@AloisMahdal: SIGHUPpochodzi z dnia, w którym linie telefoniczne były powszechne. Ten sygnał został wysłany, aby wskazać, że linia się rozłączyła. Później, gdy było to mniej powszechne, SIGHUPdemony używały czasem do ponownego odczytu pliku konfiguracyjnego bez ponownego uruchamiania procesu. W dzisiejszych czasach SIGHUPjest rzadko używany. Wiele demonów będzie miało swój własny sposób na ponowne zainicjowanie (tj . apachectl gracefulLub rndc reconfig. W przypadku rzeczy, których nie należy, należy używać [init.d|smf|upstart|launchd]kontroli tam, gdzie to możliwe.
bahamat
13

Powinieneś zacząć od najłagodniejszego i eskalować od tego miejsca. Oznacza to, SIGINT, SIGTERM, SIGQUIT, SIGKILL. Chociaż większość ludzi pomija SIGINT i SIGQUIT.

Ignacio Vazquez-Abrams
źródło
Ponadto niektóre aplikacje (takie jak JDK) obsługują SIGQUIT inaczej. Prawdopodobnie nie użyłbym SIGQUIT, nie wiedząc, jak obsługuje go określona aplikacja.
dimo414