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

Meer Borg
źródło

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.

tgm4883
źródło
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).

Eliah Kagan
źródło
Nadal nie zawsze działa, więc musi być coś jeszcze.
Craig Hicks,