killall nie zabija wszystkich i rzadko zabija, jakie jest zatem polecenie?


12

Czasami używam killallpolecenia do zabijania procesów. Powodem, dla którego mówię czasami, jest to, że w niektórych przypadkach nie zadziałało to dla mnie.

Niedawnym przykładem był Thunderbird, w którym było około 5 instancji w pamięci, więc zdecydowałem się użyć killallpolecenia. Zabił 2 procesy, a 3 pozostały w pamięci. Próbowałem ponownie, a trójka wciąż tam była.

Więc ręcznie użyłem kill -9polecenia, aby zabić każdy z poszczególnych procesów za pomocą ich pid. To się udało.

Najczęściej używam kill -9polecenia, gdy działa. To killallpolecenie zawiodło mnie tyle razy, że po prostu nie zawracam sobie głowy korzystaniem z niego. Ale musi być powód, dla którego to nie działa. Czy używam tego źle?

Wiem, że istnieją inne polecenia, pkillale byłbym wdzięczny za zrozumienie, dlaczego killallpolecenie nie działa zgodnie z oczekiwaniami. Próbowałem nawet zabić tylko jeden proces i jest to romans typu hit and miss. Ale kill -9polecenie działa za każdym razem.

Jakieś pomysły?

PS: sudonie robi różnicy

Odpowiedzi:


22

Ze strony podręcznika dla killall

killall wysyła sygnał do wszystkich procesów uruchamiających dowolne z określonych poleceń. Jeśli nie podano nazwy sygnału, wysyłany jest SIGTERM.

Kiedy to zrobisz kill -9, wysyłasz sygnał SIGKILL. Jeśli chcesz wysłać SIGKILL z killall, musisz to zrobić

killall -s SIGKILL <PROCESSNAME>

Dobre wyjaśnienie różnicy między SIGKILL a SIGTERM (i dlaczego powinieneś najpierw wypróbować SIGTERM)

Od http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/

Wysyłanie sygnałów do procesów wykorzystujących kill w systemie uniksowym nie jest nowym tematem dla większości administratorów systemów, ale wiele razy pytano mnie o różnicę między kill a kill -9.

Za każdym razem, gdy użyjesz zabicia w procesie, faktycznie wysyłasz sygnał do procesu (w prawie wszystkich sytuacjach - zajmę się tym wkrótce). Standardowe aplikacje C mają plik nagłówkowy, który zawiera kroki, które powinien wykonać proces, jeśli otrzyma określony sygnał. Możesz uzyskać całą listę dostępnych sygnałów w swoim systemie, sprawdzając stronę man pod kątem zabicia.

Rozważ takie polecenie:

kill 2563

To wysłałoby do procesu sygnał o nazwie SIGTERM. Gdy proces otrzyma powiadomienie, może się zdarzyć kilka różnych rzeczy:

  • proces może zostać natychmiast zatrzymany
  • proces może zostać zatrzymany po krótkim czasie po oczyszczeniu zasobów
  • proces może działać bez końca

Aplikacja może określić, co chce zrobić po otrzymaniu SIGTERM. Podczas gdy większość aplikacji oczyści zasoby i przestanie działać, niektóre mogą tego nie zrobić. Aplikacja może być skonfigurowana do robienia czegoś zupełnie innego po otrzymaniu SIGTERM. Ponadto, jeśli aplikacja jest w złym stanie, takim jak oczekiwanie na dyskowe operacje we / wy, może nie być w stanie zareagować na wysłany sygnał.

Większość administratorów systemu zwykle ucieka się do bardziej nagłego sygnału, gdy aplikacja nie reaguje na SIGTERM:

kill -9 2563

-9 mówi komendie kill, że chcesz wysłać sygnał # 9, który nazywa się SIGKILL. Przy takiej nazwie oczywiste jest, że ten sygnał ma nieco większą wagę.

Chociaż SIGKILL jest zdefiniowany w tym samym pliku nagłówka sygnału co SIGTERM, proces nie może go zignorować. W rzeczywistości proces nie jest nawet informowany o sygnale SIGKILL, ponieważ sygnał trafia bezpośrednio do inicjacji jądra. W tym momencie init zatrzyma proces. Proces ten nigdy nie ma możliwości uchwycenia sygnału i działania na nim.

Jednak w niektórych sytuacjach jądro może nie być w stanie skutecznie zabić procesu. Jeśli proces czeka na sieciowe lub dyskowe operacje we / wy, jądro nie będzie w stanie go zatrzymać. Procesy zombie i procesy zatrzymane w nieprzerwanym śnie nie mogą być zatrzymane przez jądro. Wymagane jest ponowne uruchomienie komputera, aby usunąć te procesy z systemu.

Gdy wysłałeś killall (SIGTERM) do procesów Thunderbirda, poprosiłeś o zatrzymanie tych procesów. Niektóre z tych procesów nie działały poprawnie (prawdopodobnie dlatego musiałeś je najpierw zabić), więc nie mogły działać na sygnał SIGTERM.


Jakieś spekulacje na temat tego, dlaczego zabił tylko niektóre instancje thunderbirda?
— Meer Borg,

@Doogfar Zobacz mój edytowany tekst (lub stronę, do której
— linkowałem

Dzięki, wyjaśnia także, dlaczego mój Thunderbird został uszkodzony, zabójstwo -9 było zbyt surowe
— Meer Borg

Nadal nie zawsze działa.
— Craig Hicks,

4

killallakceptuje większość tej samej składni co kill. W szczególności nie ma potrzeby pisania niczego wymyślnego, aby killallzrobić odpowiednik kill -9. To działa dobrze:

killall -9 thunderbird

(Oczywiście, jak omówiono, zwykle powinieneś niechętnie stosować killall -9lub równoważnie killall -KILL, chyba że inne środki zostały już wypróbowane bez powodzenia).


Nadal nie zawsze działa, więc musi być coś jeszcze.
— Craig Hicks,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.