Kiedy biegną
Wygląda na to, że możesz to po prostu zrobić z kill
wyjściem jobs -p
.
Przykład
$ sleep 1000 &
[1] 21952
$ sleep 1000 &
[2] 21956
$ sleep 1000 &
[3] 21960
Teraz mam 3 fałszywe zadania.
$ jobs
[1] Running sleep 1000 &
[2]- Running sleep 1000 &
[3]+ Running sleep 1000 &
Zabij ich wszystkich w ten sposób:
$ kill $(jobs -p)
[1] Terminated sleep 1000
[2]- Terminated sleep 1000
[3]+ Terminated sleep 1000
Potwierdzając, że wszyscy zniknęli.
$ jobs
$
Kiedy zostaną zatrzymani
Jeśli masz zadania, które są zatrzymane, nie uruchomione, zrób to zamiast tego.
Przykład
$ kill $(jobs -p)
$ jobs
[1]+ Stopped sleep 1000
[2]- Stopped sleep 1000
[3] Stopped sleep 1000
OK, żeby ich nie zabić, ale to dlatego, że sam proces zabicia nie może obsłużyć sygnału zabicia, jest zatrzymany. Więc zamiast tego powiedz systemowi operacyjnemu zabijanie. Po to -9
jest a .
$ kill -9 $(jobs -p)
[1]+ Killed sleep 1000
[2]- Killed sleep 1000
[3] Killed sleep 1000
Tak lepiej
$ jobs
$
Gdy niektóre działają, a niektóre są zatrzymane
Jeśli masz mieszany zestaw procesów, w których niektóre są zatrzymywane, a niektóre są uruchomione, możesz zrobić kill
pierwszy, a następnie kill -9
.
$ kill $(jobs -p); sleep <time>; \
kill -18 $(jobs -p); sleep <time>; kill -9 $(jobs -p)
Nieco wydłużając czas, jeśli potrzebujesz więcej, aby procesy mogły się najpierw zatrzymać.
Sygnały
Ani HUP (-1), ani SIGTERM (-15) do zabicia się nie powiedzie. Ale dlaczego? To dlatego, że sygnały te są milsze w tym sensie, że każą aplikacji się zakończyć. Ale ponieważ aplikacja jest w stanie zatrzymania, nie może przetwarzać tych sygnałów. Jedynym oczywiście jest użycie SIGKILL (-9).
Możesz zobaczyć wszystkie sygnały, które kill
zapewnia kill -l
.
$ kill -l | column -t
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
Jeśli chcesz dowiedzieć się jeszcze więcej na temat różnych sygnałów gorąco zachęcać do obejrzenia na stronie sygnały mężczyzna, man 7 signal
.
+
symbol dla pierwszego procesu i-
symbol dla drugiego procesu, a brak symbolu w trzecim?terminate
zamiast tegokill
, ponieważ przeczytałem, że jest to bezpieczniejsze. Próbowałemkill -15 $(jobs -p)
, ale to nie przyniosło efektu. Domyślam się, że zatrzymane procesy można tylko zabić, ale potem ponowniekill %number
przerywa (indywidualne) zatrzymane procesy.+
i-
to tylko ostatnie procesy, których dotknąłem, gdy tworzyłem przykłady. Te+
środki, aby wszelkie polecenia, które wyraźnie nie zawierać%#
będzie działać na tej komendzie. Dash (-
) jest drugim do ostatniego polecenia, którego dotknąłem.kill -9 ..
powinien był działać. jakie są procesy Czy są to procesy nieczynne czy osierocone?Możesz tego spróbować.
Jeśli jednak chcesz zakończyć proces, możesz wydać polecenie jako:
Na stronie polecenia Wiki
Kill
Procesowi można wysłać sygnał SIGTERM na cztery sposoby (w tym przypadku ID procesu to „1234”):
Do procesu można wysłać sygnał SIGKILL na trzy sposoby:
Jak wyjaśniono w tej odpowiedzi, jest to różnica między zakończeniem a zabiciem .
Sygnał zakończenia, SIGTERM , jest sygnałem, który można przechwycić w programie. Często procesy, które mają działać w tle, wychwytują ten sygnał i rozpoczynają proces zamykania, co powoduje czyste wyjście. Sygnał zabicia, SIGKILL , nie może zostać przechwycony. Gdy zostanie wysłany do procesu, spowoduje to nagłe zakończenie tego programu.
Na przykład podczas zamykania lub ponownego uruchamiania komputera zwykle SIGTERM jest wysyłany do uruchomionych procesów, umożliwiając im zakończenie w czysty sposób, jeśli obsługują ten proces. Następnie, po kilku sekundach, SIGKILL jest wysyłany do procesów, które są nadal uruchomione, dzięki czemu zasoby w użyciu są uwalniane siłą (np. Pliki w użyciu) i sekwencja zamykania może być kontynuowana (np. Odmontowywanie systemów plików).
źródło
kill
każdy proces w tle. Czy istnieje jednak jakikolwiek sposóbterminate
, skoro uważam, że jest to bezpieczniejsze?-15
polecenia kill.-15
tutaj też nie będzie działać. Zobacz moje A.kill -9
w moim przykładzie nie zadziałałoby.Ok, bawiąc się z tym, widzę, że kiedy zabijesz zadanie, które jest zatrzymane (gdzie wykonywanie zostało wstrzymane, ale nie zostało zakończone), to nie skończy się, dopóki nie zostanie przeniesione na pierwszy plan. Programy są zwykle zatrzymywane przez naciśnięcie Ctrl- Zna terminalu. Większość terminali wysyła
SIGSTOP
w tym przypadku, ale oczywiście są też inne sposoby wysyłania, takie jak za pomocąkill -STOP
lubkill -19
.To normalne zachowanie, że program nie kończy się od razu, ponieważ program musi być uruchomiony, aby przetworzyć domyślny
SIGTERM
sygnał wysłany przezkill
. Co więcej, czasami pobash
wysłaniuSIGTERM
do procesu w tle, jakoś kończy się zatrzymanie (chociażSIGTERM
nadal jest w toku).Najbezpieczniejszym sposobem na zakończenie wszystkich zadań ( bez uciekania się do nich
kill -9
) jest wysłanieSIGTERM
normalnegokill
, a następnie wysłanieSIGCONT
do pozostałych zadań, np .:SIGCONT
(18
To numer sygnału) przyniesie żadnych zatrzymane pracy na planie tak, że mogą one przetwarzaćSIGTERM
, ponieważ zwykle.Jeśli wszystkie programy nie zakończą się tym, istnieje kilka innych sygnałów, które można wypróbować, które normalnie zakończą proces, zanim uciekniesz się do niego
kill -9
. Pierwszy polecam,SIGHUP
ponieważ wiele programów, które zwykle blokują inne sygnały zakończenia, odpowiadaSIGHUP
. Jest to zwykle wysyłane, gdy terminal kontrolny zostanie zamknięty, w szczególności jest wysyłane, gdy kończy sięssh
sesjatty
. Wiele programów interaktywnych, takich jak powłoki, nie reaguje na inne sygnały zakończenia, ale reaguje na to, ponieważ byłoby problem z ich kontynuowaniem possh
zakończeniu sesji (lub po zamknięciu dowolnego kontrolującego terminala). Aby tego spróbować, możesz to zrobićZnowu oczywiście musisz upewnić się, że program nie został zatrzymany, aby mógł przetworzyć sygnał. Inne sygnały zakończenia, które możesz wypróbować, to
SIGINT
(kill -2
) iSIGQUIT
(kill -3
). Ale oczywiście korzyści wynikające z wypróbowania pełnego zakresu zmniejszają się i mogą prowadzić do nieuniknionegoSIGKILL
(akakill -9
).źródło
man signal
, możesz zdobyć materiał referencyjny, aby to zrobić .kill -9 ..
metoda będzie działać w większości przypadków. Czasami spowoduje to, że procesy będą się zawieszać, więc przez dłuższy czas zawiedzie. To kompromis, który musisz podjąć. Lepiej mieć ciężką rękę i zabijać wszystko, ryzykując dane / czyszczenie w porównaniu z bardziej miękkim czyszczeniem, ale musisz robić więcej analiz, gdy twoje zabójstwa stają się coraz bardziej surowe.kill -9
gdy tylko jest to możliwe, ponieważ po prostu wyciąga wtyczkę, nie dając programowi szansy na prawidłowe wyczyszczenie. Zaktualizuję z kilkoma alternatywami.kill ..; sleep <time>; kill -18 ..
; spać <czas>; zabij -9 .... Basically working up to the
-9`.kill -18
jest zdecydowanie czymś, z czego należy korzystać, ponieważ często są zatrzymywane zadania (a w niektórych przypadkach wydaje się, że wbash
jakiś sposób przestają one uruchamiać zadania przed wysłaniemSIGTERM
). Jak wspomniano powyżej,SIGHUP
warto również spróbować, ponieważ wiele programów, które nie reagują na inne, odpowie na to (wypróbuj to z powłoką). Poza tym tak, nie jest to tak opłacalne, ponieważSIGKILL
prawdopodobnie jest nieuniknione.Spowoduje to zakończenie wszystkich zadań w bieżącej powłoce jeden po drugim:
Objaśnienie:
%
odnosi się do ostatniego zadania na liście, więc będzie się zapętlać, dopókikill
nie zwróci wartości niezerowej, co oznaczałoby, że nie ma już więcej zadań do zakończenia.Innym podejściem może być najpierw wysłanie
SIGTERM
, a następnieSIGCONT
kontynuowanie pracy i pierwszą rzeczą, którą zrobią, będzie otrzymanie TwojejSIGTERM
.(z jakiegoś powodu wbudowane
kill
jest dziwne, więc użyłem tutaj zewnętrznego).źródło