Коли ви намагаєтесь припинити процес назавжди, який варіант для "вбивства" ви повинні використовувати?


26

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

kill 'x'
killall 'x'
kill -9 'x'

Це кілька варіантів, про які мені говорили до цих пір, але деякі люди кажуть, що вбивати -9 - це просто перебор, вбивство само по собі не працює і т.д.

Хтось має якусь пораду щодо того, яку з них слід використовувати в найстандартнішому випадку просто припинення процесу (а отже, і його стану)?

[редагувати] Я шукаю, що використовувати, коли ви хочете зупинити виконання свого процесу, щоб ви могли запустити новий, свіжий з самого початку


1
Дивіться також лист UUK9-листа, який застерігає від зловживань SIGKILL.
jw013

1
Перерахувати всі різні сигнали разом з їх номером: kill -lі перевести номер у відповідне ім'я сигналу, наприклад kill -l 9, повернеться KILL.

Відповіді:


24

Існує ряд сигналів, за замовчуванням яких розміщення - це припинення процесу. Кінцевим сигналом припинення є SIGKILL, оскільки з ним не можна керувати, і процес не має іншого вибору, як померти. Це також означає, що якщо ви надішлете його, процес позбавляється можливості очищення. Тому вдалий спосіб вимагає надіслати такий сигнал, як SIGTERM, який можна обробити спочатку і лише в тому випадку, якщо процес не вийде через деякий час, надішліть його SIGKILL.

Зауважте, що SIGINT і SIGQUIT не є хорошими кандидатами для довільного припинення процесу. Через те, що їх можна генерувати з клавіатури терміналу, багато додатків використовують їх для спеціальних цілей. Наприклад, інтерпретатор python використовує SIGINT для генерування KeyboardInterruptвиключень (також у інтерактивних сесіях python, де він просто повертається до підказки), а JVM використовує SIGQUIT для скидання стежок стеків. SIGINT і SIGQUIT залишаються ефективними для більшості стандартних утиліт командного рядка, таких як findабо cat.

Під час відключення системи більшість систем UNIX та Linux надсилає SIGTERM на весь процес, після чого чекає 5 секунд, а потім - SIGKILL. Це рекомендований спосіб безпечного вимкнення довільного процесу.

Зауважте також, що навіть SIGKILL може не припинити процес, який застряг у режимі безперебійного очікування, поки процес не прокинеться.


1
Відмінна відповідь. Чи є у вас посилання на kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;рекомендацію?
l0b0

+1 відповідь. А як щодо SIGHUP?
Алоїз Магдал

2
@AloisMahdal: SIGHUPпочинається з дня, коли комутовані лінії були поширеними. Цей сигнал був надісланий, щоб вказати, що лінія зависла. Пізніше, коли це було менш поширеним SIGHUP, демони іноді використовувались для перечитування конфігураційного файлу без перезапуску процесу. У ці сучасності SIGHUPвикористовується рідко. Багато демонів матимуть свій спосіб реініціалізації (тобто, apachectl gracefulабо rndc reconfigдля речей, які цього не роблять, ви повинні використовувати [init.d|smf|upstart|launchd]елементи управління, де це можливо.
bahamat

13

Слід почати з найніжнішого і звідти ескалювати. Це означає, SIGINT, SIGTERM, SIGQUIT, SIGKILL. Хоча більшість людей пропускають SIGINT та SIGQUIT.


Крім того, деякі програми (наприклад, JDK) по-різному обробляють SIGQUIT. Я, мабуть, не використовував би SIGQUIT, не знаючи, як конкретна програма обробляє це.
dimo414
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.