Jak zakończyć wszystkie procesy o tej samej nazwie w bardziej łagodny sposób killall
? Nie chcę zakłócać procesów, ale daję im czas na właściwe zakończenie pracy.
Zobacz też:
Jaka jest różnica w Monitorze systemu między Kill Process a End Process?
command-line
process
kill
killall
orzechowy o natty
źródło
źródło
Odpowiedzi:
1. „killall” jest już miły (SIGTERM)
killall
domyślnie wysyłaSIGTERM
. To już dobre podejście, które pozostawia aplikacjom szansę na posprzątanie po sobie. „Idź i umrzyj już teraz!” podejście polega na wysłaniuSIGKILL
sygnału, który wymaga podania tej opcji jako opcjikillall
. Z biblioteki GNU C: Sygnały zakończenia :2. Równie ładny „koniec procesu” Monitora systemu (SIGTERM)
Link do pytania dotyczącego Monitora systemu GNOME. Dotyczy to
SIGTERM
również akcji „Zakończ proces” (i zdaję sobie sprawę, że zaprzeczam odpowiedzi na to pytanie). Możesz go znaleźć w kodzie źródłowym, aby zweryfikować siebie:data / menu.ui :
15 tutaj jest numerem sygnału. Sygnał 15 jest
SIGTERM
. Monitor systemu korzystał jużSIGTERM
wcześniej, zanim zadano inne pytanie i udzielono na nie odpowiedzi.Dodatek techniczny (w odpowiedzi na komentarz)
Przeglądając reprezentację Github
git blame
, oto zmiany, które zostały wprowadzone w sposobie zapisywania sygnałów w kodzie źródłowym GNOME System Monitor:383007f2 24 lipca 2013 Zastąpiono zduplikowany kod do wysyłania sygnałów o parametrach
GAction 0e766b2d 18 lipca 2013 Menu podręczne procesu portu do GAction
97674c79 3 października 2012 Pozbądź się struktury
ProcData 38c5296c 3 lipca 2011 Ujednolicenie wcięcia między plikami źródłowymi.
Żadne z nich nie zmieniło się od
SIGQUIT
doSIGTERM
, a ten ostatni był przed zadaniem powiązanego pytania.źródło
15
? W pewnym momencie mogła zostać zmieniona, więc stara odpowiedź może być w 100% poprawna w stosunku do starej wersji.git grep 'SIGQUIT'
niczego nie ujawnia. Dlagit grep '>3<'
obu nie znaleziono nic związanego z sygnałami . Dochodzę do wniosku, że najprawdopodobniej monitor systemu gnome nigdy nie używałSIGQUIT
.git grep
przeszukuje tylko bieżące drzewo, a nie całą historię. Użyłemgit blame
(właściwie odpowiednika Github), aby kopać nieco głębiej, ale nadal nic.Odpowiedź @hvd jest zasadniczo poprawna. Aby jeszcze bardziej wykonać kopię zapasową,
init
proces najpierw wyśleSIGTERM
do procesów, gdy zamykasz komputer, a następnie z opóźnieniem wyśle,SIGKILL
jeśli jeszcze się nie zakończył. Procesy nie mogą obsługiwać / ignorowaćSIGKILL
.Aby podać nieco więcej szczegółów, prawdziwą odpowiedzią jest to, że nie masz możliwości wiedzieć na pewno, że program to obsługuje.
SIGTERM
jest najczęściej stosowanym sygnałem do grzecznego proszenia programu o wyjście z programu, ale cała obsługa sygnału zależy od tego, czy program coś zrobi z sygnałem.Innymi słowy, jeśli masz program napisany przez @Jos lub @AlexGreg, to prawdopodobnie byłyby one obsługiwane,
SIGQUIT
ale prawdopodobnie nieSIGTERM
, a zatem wysyłanieSIGTERM
byłoby mniej „miękkie” niżSIGQUIT
.Napisałem trochę kodu, żebyś mógł się nim bawić. Zapisz poniżej jako
signal-test.c
, a następnie skompiluj zNastępnie możesz go uruchomić
./signal-test
i zobaczyć, co się stanie, gdy wyślesz różne sygnały za pomocąkillall -s <signal>
.W obecnej postaci kod obsługuje zarówno SIGTERM, jak i SIGQUIT z wdziękiem. Możesz spróbować skomentować linie
signal(SIG...
(za pomocą a//
na początku linii), aby usunąć moduł obsługi sygnałów, a następnie uruchomić i wysłać sygnały ponownie. Powinieneś być w stanie zobaczyć te różne wyniki:w zależności od tego, czy obsługujesz sygnały, czy nie.
Możesz także spróbować zignorować sygnały:
Jeśli to zrobisz, wysyłanie
SIGTERM
nic nie da, będziesz musiał użyć,SIGKILL
aby zakończyć proces.Więcej szczegółów w
man 7 signal
. Pamiętaj, że używaniesignal()
w ten sposób jest uważane za nieprzenośne - jest to o wiele łatwiejsze niż alternatywa!Jeszcze jeden drobny przypis - w systemie Solaris
killall
próbuje zabić wszystkie procesy. Wszyscy. Jeśli uruchomisz go jako root, możesz być zaskoczony :)źródło
pkill
. Innym powodem jest to, że łączy się on z parąpgrep
, co ułatwia sprawdzenie, które procesy zostaną zabite, a które mają lepszą dopasowaną semantykę niżps | grep
.„Koniec wszystko” byłoby
killall -s SIGQUIT [process name]
. Jeśli chcesz wymyślne rozwiązanie, zdefiniujalias endall='killall -s SIGQUIT'
.źródło
SIGQUIT
jest jak zrobienie procesuabort(3)
: zrzuca rdzeń, a następnie zabija proces. Nie jest to w żaden sposób ładniejsze / łagodniejsze / milsze niżSIGTERM
to, co jest domyślnekillall
.SIGQUIT
(lub nawet lepiejSIGINT
), można go traktować bardziej „miękko” niżSIGTERM
, ale to zależy od zastosowania. Nieobsługiwane żadne z nich powoduje natychmiastowe rozwiązanie umowy.