Jaka jest różnica między „killall” a „pkill”?

92

Po użyciu po prostu kill <some_pid>na systemach Unix przez wiele lat, dowiedziałem się pkillz młodszym Linux-zrozumiały współpracownika kolegi 1 .

Wkrótce zaakceptowałem sposób Linux- pgrepa i pkill-ing przez wiele dni i nocy, przez spowolnienia i warunki wyścigowe. Wszystko było dobrze i dobrze.

Ale teraz widzę tylko killall. Wydaje się, że poradniki tylko wspominają killalli nie jestem pewien, czy jest to jakiś równoległy rozwój, czy killalljest następcą pkilllub czymś innym.

Wydaje się działać jako bardziej ukierunkowany pkill, ale jestem pewien, że coś mi umknęło.

Czy osoba znająca system Ubuntu / Debian 2 może wyjaśnić, kiedy (lub dlaczego) killallpowinna być używana, szczególnie jeśli powinna być używana zamiast pkill(kiedy pkillczęsto wydaje się to łatwiejsze, ponieważ mogę być niechlujny z dopasowywaniem nazw, przynajmniej domyślnie).

Mówiąc o killall, nie myślę o poleceniu, które w niektórych systemach uniksowych (Solaris, AIX,?) Zabiłoby wszystkie procesy użytkownika. Oto opis tej wersji ze strony podręcznika dla systemu AIX IBM :

Komenda killall anuluje wszystkie uruchomione procesy, z wyjątkiem tych, które powodują proces killall. To polecenie zapewnia wygodny sposób anulowania wszystkich procesów utworzonych przez kontrolowaną powłokę. Po uruchomieniu przez użytkownika root polecenie killall anuluje wszystkie anulowane procesy oprócz tych, które je uruchomiły. Jeśli podano kilka sygnałów, działa tylko ostatni.

1 „kolega” to bezpłatne uaktualnienie od „współpracownika”, więc równie dobrze może.
2 Początkowo myślałem, że to Linux lub Debian, ale niektóre źródła podają, że Linux killallpochodzi z Uniksa o smaku BSD.

Belacqua
źródło

Odpowiedzi:

68

Myślę, że widzisz killall w instrukcjach, ponieważ domyślnie wymaga dokładnej nazwy procesu, podczas gdy pkill wykonuje podstawowe dopasowanie wzorca. Dzięki temu killall jest bezpieczniejszy dla użytkowników, którzy mogą ślepo kopiować i wklejać.

Zarówno Pkill, jak i killall mają różne opcje. Killall ma flagę pasującą do wieku procesu, pkill ma flagę zabijającą procesy tylko na danym tty. Etcetera ad nauseum. Nic nie jest lepsze , mają tylko różne specjalności.

Widzę z ich stron podręcznika man, że killall pochodzi z pakietu psmisc , który ma kilka narzędzi do zarządzania procesami, ale w szczególności nie zawiera ps. Jest to pakiet procps, który zawiera między innymi ps, top, kill i pkill. Założę się, że procps początkowo nie miał zdolności pkill, więc psmisc podrapał się i wymyślił killall.

Strona man pkill / pgrep mówi, że zostały wprowadzone w Solarisie 7. Jak wspomniałeś, jgbelacqua , killall Solaris nie był narzędziem psmisc, dlatego Solaris prawdopodobnie miał tylko pakiet procps. Ktoś chciał narzędzia do dopasowywania wzorców, a więc pkill i pgrep. Czy to zostało opracowane przez programistę procps, czy dodane później, nie wiem. Bez względu na to, wszedł i stał się częścią * nixes wszędzie.

Więcej źródeł:

djeikyb
źródło
1
Hmm - był killall(stary?) System Solaris, ale zachowywał się inaczej. Zabił wszystko.
belacqua
6
@manish - er, w systemach SysV istniał inny killall.
belacqua
1
@djeikyb Myśl o tym, że killall jest bezpieczniejszy, brzmi dobrze, a przynajmniej może to tłumaczyć jego popularność.
belacqua
5
@Manish: pkill (bez zabicia) nie potrzebuje numeru pid ani nazwy procesu. Dopasowuje tupot w nazwie procesu.
Javier Rivera
3
killall is safer for users to blindly copy and paste, z wyjątkiem sytuacji, gdy jesteś na komputerze, na którym killall naprawdę zabija wszystko. To niefortunne, że dwa różne narzędzia mają tę samą nazwę.
Lie Ryan,
7

Uważaj na „killall”. W niektórych systemach (zapominam które) killall zabija wszystkie procesy. Po cichu zignoruje argumenty i całkowicie zatrzyma system.

szachista
źródło
5
To nie jest prawda. killall bez żadnych argumentów nic nie zrobi, a killall nie zignoruje argumentów. kill -9 -1może zabić twój system, a także killall -9 -1może. Ale nie tylkokillall [program]
Thomas Ward
6
Dotyczy to systemów SysV, jak już wspomniano w pierwotnym pytaniu.
alanc
3

jeśli aktywujesz / etc / bash_completion, po killall <part_of_process_name>i naciśnij tab - auto uzupełnia nazwę procesu z listy uruchomionych procesów

strumień
źródło
2
To samo automatyczne uzupełnianie zostanie wykonane przy pomocy pgrep / pkill. Coś, co zwykle robię, to pkill plug<tab>zabijanie wtyczki flash dla firefoxa, kiedy wiem, że nie mam nic, z czego chciałbym korzystać przez jakiś czas, ale nadal chcę aktywnie używać firefoxa. Jest to funkcja powłoki, a nie różnica między killall a pgrep / pkill.
Arcege
1
Nie powiedziałem, że to różnica - po prostu fajna funkcja pozwalająca uniknąć wyszukiwania PID, nazw procesów itp.
jet
2

Jeśli spojrzysz na opcje obu programów, zobaczysz, że oba robią to samo, ale na różne sposoby.

pkill wykona dopasowanie dla różnych atrybutów procesu (CMD, PID, PPID, UID ...) i wyśle ​​dany sygnał do każdego pasującego procesu. (W przypadku CMD używane jest wyrażenie regularne, w innych jest to ciąg znaków). pkill nie jest interaktywny, ale lepszy dla programów wsadowych.

killall wykona dopasowanie dla nazwy procesu (comm) lub użytkownika (użytkownika), a nie dla całego ciągu poleceń. Argument jest używany jako prosty ciąg i musi być zgodny z całą wartością „comm” (istnieje również opcja --regexp, aby to zmienić). killall ma opcje --interactive i --younger-than, których pkill nie ma.

Istnieje również killall5 pochodzący z dni SysV i został przeniesiony do innych wariantów UNIX (podobno w pakiecie Ubuntu „sysutils”). Zachowuje się to inaczej w starym stylu. Było to często używane wewnętrznie w skryptach inicjujących w celu zamknięcia lub przejścia do trybu pojedynczego użytkownika.

Arcege
źródło
2
Nie, ani pkillnie killallnależy go używać w skryptach, tylko interaktywnie i ostrożnie.
geirha