Яка різниця між 'killall' та 'pkill'?


92

Після використання просто kill <some_pid>на системах Unix багато років, я дізнався pkillвід молодшого Linux-підкованою напарниці колеги 1 .

Невдовзі я прийняв Linux-шлях, pgrepіing і pkill-ing через багато днів і ночей, через повільні спади та умови гонки. Це все було добре і добре.

Але зараз я нічого не бачу, окрім killall. Як, мабуть, лише згадується killall, і я не впевнений, чи це якась паралельна розробка, чи killallє її наступником pkill, чи щось інше.

Здається, він функціонує як більш цілеспрямований pkill, але я впевнений, що мені чогось не вистачає.

Чи може Ubuntu / Debian-підкований 2 людина пояснити, коли (або навіщо) killallслід використовувати, особливо якщо це слід використовувати на перевагу pkill(коли це pkillчасто здається легшим, тому що я можу бути шахрайовим зі збігом імен, принаймні за замовчуванням).

Якщо говорити про killall, я не думаю про команду, яка в деяких системах Unix (Solaris, AIX,?) Знищить усі користувацькі процеси. Ось опис цієї версії з сторінки сторінки для AIX IBM :

Команда killall скасовує всі запущені процеси, крім тих, що виробляють процес killall. Ця команда забезпечує зручний спосіб скасування всіх процесів, створених оболонкою, якою ви керуєте. Коли його запускає користувач root, команда killall скасовує всі процеси, що можна скасувати, крім тих процесів, які його запустили. Якщо вказано кілька сигналів, діє лише останній.

1 "колега" - це безкоштовне оновлення від "колеги", так само може бути.
2 Спочатку я думав, що це справа Linux або Debian, але деякі джерела говорять про те, що Linux killallпоходить від Unix з ароматом BSD.

Відповіді:


68

Я думаю, що ви бачите killall в інструкціях, тому що за замовчуванням він вимагає точної назви процесу, тоді як pkill не відповідає основній схемі. Таким чином, killall безпечніше для користувачів сліпо копіювати та вставляти.

Pkill і killall мають обидва варіанти. У Killall є прапор, який відповідає віку процесу, у pkill є прапор лише для вбивства процесів на заданій tty. Etcetera ad nauseum. Ні краще , вони просто мають різні спеціальності.

Я бачу зі своїх сторінок man, що killall надходить із пакету psmisc , який має кілька утилітів управління процесами, але, зокрема, не містить ps. Це пакет propps, який містить ps, top, kill та pkill (серед інших). Я б ставку у реквізитів спочатку не мав pkill, тому psmisc почухав свербіж і придумав killall.

Сторінка чоловіка pkill / pgrep говорить, що вони були представлені в Solaris 7. Як ви вже згадуєте, jgbelacqua , killall Solaris не був утилітою psmisc, тому Solaris, ймовірно, мав лише пакет propps. Хтось хотів, щоб інструмент процесу відповідності шаблону, таким чином pkill і pgrep. Чи був він розроблений розробником Props або доданий згодом, я не знаю. Незалежно від цього він ввійшов і став частиною * nixes всюди.

Більше джерел:


1
Хм - існувала вбудована killall(стара?) Система Solaris, але вона поводилася інакше. Це вбило все.
белаква

6
@manish - er, у системах SysV була інша кілла.
belacqua

1
@djeikyb Думка про те, що killall є більш безпечною, звучить правильно, або, принаймні, це може пояснити велику її популярність.
белакква

5
@Manish: pkill (не вбивати) не потрібен номер pid, ні ім'я процесу. Це відповідає малюнку назви процесу.
Хав'єр Рівера

3
killall is safer for users to blindly copy and paste, за винятком випадків, коли ви знаходитесь на машині, де Killall насправді всіх убиває. Прикро, що обидві різні комунальні служби мають однакову назву.
Лі Лі Раян

7

Будьте обережні з "killall". У деяких системах (я забуваю, які) killall вбиває всі процеси. Це мовчки ігнорує аргументи і повністю припинить вашу систему.


5
Це не правда. killall без будь-яких аргументів нічого не зробить, а killall не буде ігнорувати аргументи. kill -9 -1може вбити вашу систему, а також killall -9 -1може. Але не тількиkillall [program]
Томас Уорд

6
Це правда для систем SysV, про що зараз говорилося в оригінальному запитанні.
alanc

3

якщо ви активуєте / etc / bash_completion, killall <part_of_process_name>вкладку після та натискання - автоматично завершує ім'я процесу зі списку запущених процесів


2
Те саме автозавершення буде зроблено з pgrep / pkill. Щось зазвичай я роблю, - pkill plug<tab>це вбивати флеш-плагін для firefox, коли я знаю, що я не маю нічого, що хочу використовувати деякий час, але все ще хочу активно використовувати firefox. Це функція оболонки, а не різниця між killall та pgrep / pkill.
Арседж

1
Я не говорив , різниця - лише гарна можливість уникнути пошуку PIDs, імена процесів і т.д.
струменя

2

Якщо ви подивитеся на варіанти обох програм, то побачите, що вони обидва роблять одне і те ж, але по-різному.

pkill виконає відповідність різним атрибутам процесу (CMD, PID, PPID, UID ...) і відправить даний сигнал кожному процесу, який відповідає. (Для CMD використовується регулярний вираз, для інших це рядок). pkill не є інтерактивним, але краще для пакетних програм.

killall буде виконувати відповідність на ім'я процесу (comm) або користувача (користувача), а не на всій командній рядку. Аргумент використовується як простий рядок і повинен відповідати всьому значенню 'comm' (також є можливість --regexp змінити це). killall має - інтерактивні та --молодші варіанти, ніж у pkill немає.

Існує також killall5 від SysV днів, і він був перенесений на інші варіанти UNIX (нібито під системою Ubuntu 'sysutils'). Це по-іншому поводиться по-старому. Це часто використовувалося всередині сценаріїв init для вимкнення або зміни режиму для одного користувача.


2
Ні, ні, ні їх pkillне killallслід використовувати в сценаріях, лише інтерактивно та обережно.
geirha
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.