Коли я не повинен вбивати -9 процес?


401

Я завжди дуже вагаюся бігати kill -9, але бачу, що інші адміністратори роблять це майже звичайно.

Я вважаю, що, мабуть, є розумний середина, так що:

  1. Коли і навіщо kill -9їх використовувати? Коли і чому ні?
  2. Що слід спробувати, перш ніж це зробити?
  3. Яка налагодження "підвішеного" процесу може спричинити подальші проблеми?

Відповіді:


362

Як правило, вам слід скористатися kill(скорочується kill -s TERMабо в більшості систем kill -15) до kill -9( kill -s KILL), щоб дати цільовому процесу можливість очистити після себе. (Процеси не можуть вловлювати чи ігнорувати SIGKILL, але вони можуть і часто вловлюють SIGTERM.) Якщо ви не даєте процесу закінчити те, що він робить і очистити, він може залишити пошкоджені файли (або інший стан) навколо цього не зможе зрозуміти, щойно перезапущений.

strace/ truss, ltraceі, gdbяк правило, є гарними ідеями для вивчення того, чому застряг процес. ( truss -uОсобливо корисно для Solaris; я ltraceдуже часто знаходжу аргументи до бібліотечних викликів у непридатному форматі.) Solaris також має корисні /procінструменти, деякі з яких перенесені в Linux. ( pstackчасто корисна).


67
переконлива причина полягає в тому, що якщо ви звикли надсилати SIGKILL, то, потрапивши до програми, яка, наприклад, зіпсує важливу базу даних для вас або вашої компанії, ви дійсно пошкодуєте про це. kill -9має своє використання як термінатор останньої інстанції, роблячи акцент на останній інстанції; адміністратори, які використовують його до останньої інстанції: a) не розуміють, що вони є адміністратором, і б) не повинні бути у виробничій системі.
Арседж

9
@Mikel Інша справа - іноді найкраще обманути додаток на очищення самого себе сигналом типу SIGQUIT або SIGSEGV, якщо він не відповість на SIGINT / SIGTERM. Наприклад, повноекранний тривимірний додаток або навіть Xorg. Використовуючи SIGQUIT, у нього не буде шансу нічого очистити, але, обдуривши це, подумавши, що відбудеться несправність сегменту, і він відчує, що не має іншого вибору, як очистити та вийти.
penguin359

12
@Arcege Ви вважаєте, що використання бази даних, яка пошкоджує дані, якщо вони вбиті з -9, це база даних, яку все-таки варто використовувати? iirc, mysql, bdb, pg тощо ... всі поводяться добре, коли їх вбивають із -9.
dhruvbird

13
killall -9 java ftw
dmourati

23
@dhruvbird: саме те, що ваші БД повинні оснащуватися куленепробивними жилетами, не означає, що ви не повинні їх знімати, якщо цього не потрібно. Хоча ви можете мати рацію, що це не так ризиковано, як здається, Арседж, я думаю, його думка все ще стоїть на тому, що це ризиковано і має бути в крайньому випадку.
іконоборство

228

Рандаль Шварц часто публікував "Марно використання (x)" у списках. Один такий пост був о kill -9. Він включає причини і рецепт, який слід дотримуватися. Ось реконструйована версія (цитується нижче).

(Цитата гидоти)

Ні-ні-ні. Не використовуйте kill -9.

Це не дає процесу чисто:

1) відключити розетки

2) очищення тимчасових файлів

3) повідомити своїх дітей, що вона йде

4) скинути його термінальні характеристики

і так далі, і так далі, і так далі.

Як правило, надішліть 15, і зачекайте секунду-дві, і якщо це не працює, надішліть 2, а якщо це не працює, надішліть 1. Якщо цього не відбувається, ВИДАЛУЙТЕ БІННЯР, оскільки програма погано ведеться!

Не використовуйте kill -9. Не виймайте зернозбиральний комбайн лише для того, щоб привести в порядок квітковий горщик.

Ще одне марне використання Usenet,

(. підпис)


12
Чи не закриє операційна система будь-які відкриті дескриптори файлів (включаючи сокети), коли процес закінчується?
Брайан Гордон

3
Так, буде. Але припустимо, що ви вбиваєте серверний процес із підключеними клієнтами, тоді клієнти не помітять, що сервер минув перед таймаутами.
Бьорн Ліндквіст

45
Ага так, старий аргумент "якщо це якимось чином недосконалий, ти дурний, щоб його використовувати".
Timmmm

3
Або нерозумно використовувати, якщо процес, про який йдеться, - це ваша компанія
Warren P

3
Якщо процес буде вбитий, то сокет посилає RST одноранговому, де як би процес викликає закриття або вимикання на сокет, тоді сокет посилає FIN. Не потрібний час очікування. Ситуація з тимчасовим очікуванням відбудеться лише у випадку падіння живлення або відключення мережевого кабелю.
ctrl-alt-delor

78

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

Я говорю це як хтось, хто спробує вбити звичайний (15) спершу, тому що це дає програмі шанс зробити деяку очистку - можливо, просто записати в журнал "виходить на сиг 15". Але я не прийму жодної скарги на жорстоку поведінку вбивства -9.

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


2
Як ви протестуєте на "випадкове вбивство -9"? Коли ви отримуєте вбивство -9, ви закінчите і закінчите.
Карел Білек

18
@Karel: Ви перевіряєте, чи може ваша система після цього відновитись, і очищаєте будь-які зловмисні транзакції, які оброблялися на час SIGKILL.
Tadeusz A. Kadłubowski

7
Не нормально робити kill -9так, як не в порядку витягувати штепсельну вилку. Хоча, звичайно, є ситуації, коли у вас немає вибору, це має бути крайнім заходом. Звичайно, підтягування кабелю живлення або kill -9не повинно мати таких негативних наслідків, як перешкоджання застосуванню програми або ОС перезавантажуватися належним чином, якщо таке взагалі трапиться, але лайно трапиться і за допомогою рекомендованих способів ( kill [-15]) або регулярного відключення допоможе уникнути безладу, який може статися, якщо ви регулярно перериваєте програми та ОС таким чином. У будь-якому випадку, завжди є ризик втратити дані незалежно від надійності коду.
jlliagre

7
Я підозрюю, що Майкл мав на увазі "Гаразд" - це те, що ваша програма повинна вирішувати цю ситуацію витончено і мати можливість виконувати певну форму очищення при перезапуску. Наприклад, прибирання файлів PID тощо, а не просто викидання іграшок із дитячої коляски та відмова від запуску.
gerryk

2
@gerryk Вони дійсно повинні, але проблема полягає в тому, що деякі люди сприйматимуть цю відповідь як "ліцензію на вбивство -9" незалежно від ситуації та оточення. Це безвідповідальне ставлення.
jlliagre

39

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

Те саме стосується більшості програм (навіть баз даних): якщо я не можу їх убити без того, щоб вони перейшли, я не хочу їх використовувати. (І якщо вам трапляється використовувати одну з цих баз даних, яка спонукає вас робити вигляд, що вони зберігають дані, коли їх немає: ну, мабуть, саме час ви починаєте замислюватися над тим, що ви робите).

Тому що в реальному світі речі можуть зійти в будь-який час з будь-якої причини.

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

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


4
Я погоджуюсь, що слід писати процес, щоб він був терпимим до такої невдачі, але я думаю, що це все-таки погана практика. База даних відновиться, але вона може виявити грубе переривання, а потім викликати значну перевірку відновлення при перезапуску. А як щодо запитів, які обслуговує процес? Всі вони будуть розірвані миттєво, у клієнтів можуть виникнути помилки та помилки?
Даніель Джеймс Брайарс

3
База даних, яку неможливо вбити в будь-який час, не є належною надійною базою даних. Це досить основна вимога, якщо вам потрібна послідовність. Що стосується клієнтів: якщо вони переносять сірий кабель і пошкоджують дані, коли з'єднання розрито, вони також погано розроблені. Спосіб подолання втрати послуги - це надмірність та автоматичні стратегії відмови / повторної спроби. Зазвичай для більшості системних збоїв швидше, ніж намагатися відновити.
borud

4
@borud Це може бути не ідеально написане програмне забезпечення, але це програмне забезпечення, яке люди використовують постійно. Яким системним адміністраторам властиво завжди вибирати програмне забезпечення, написане ідеально, аж до того, щоб завжди оздоровитись після раптових зривів? Не багато. Особисто я використовую сценарії відключення та запускаю / зупиняю процеси через це. Якщо вони не реагують на сценарій відключення (що робить належну сигналізацію процесу), я вбиваю -9.
Стів Сетер

2
Немає різниці між приготуванням основних речей та складніших страв щодо інструментів. Різниця - кухар. (Однак, якщо ви витрачаєте стільки часу на приготування їжі, як і я, ви розумієте, що надійність є мінімальною вимогою до кухонних інструментів і що більшість людей, які продають кухонні приналежності споживачам, не знають поганого інструменту від чудового інструменту.)
borud

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

10

Не згадується в усіх інших відповідях - це випадок, коли він kill -9взагалі не працює, коли процес є <defunct>і не може бути знищений:

Як я можу вбити процес <defunct>, батьком якого є init?

Що є несправним для процесу і чому його не вбивають?

Тому , перш ніж намагатися kill -9в <defunct>процесі запуску , ps -efщоб побачити , що його батько і спробувати -15(TERM) або -2(INT) і , нарешті -9(уб'є) на його батьків.

Примітка: що ps -efробить .

Пізніше редагуйте та обережно: Дійте обережно, коли вбиваєте процеси, їх батьків чи своїх дітей, оскільки вони можуть залишати файли відкритими або пошкодженими, з'єднання незавершеними, можуть пошкодити бази даних тощо, якщо ви не знаєте, що kill -9стосується певного процесу, використовуйте його лише в крайньому випадку , і якщо вам потрібно запустити kill, перед використанням використовуйте вказані вище сигнали-9 (KILL)


6

Ніколи ніколи не роби kill -9 1. Також уникайте вбивства в певних процесах, таких як mount`. Коли мені доведеться вбити багато процесів (скажімо, наприклад, зависає сеанс X, і я маю вбивати всі процеси певного користувача), я змінюю порядок процесів. Наприклад:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

Майте на увазі, що killне зупиняє процес і не випускає його ресурси. Все, що він робить, - це надсилати сигнал SIGKILL процесу; ви можете завершити процес, який висів.


1
Низовим був хтось інший. Але які ресурси не звільняються? Ви просто маєте на увазі, що процес не може виконати звичайне очищення? Що з блокуваннями файлів, семафорами тощо? Чи можете ви докладно?
Мікель

Схоже на те, що спільну пам'ять SysV та семафори доведеться прибирати принаймні. archives.postgresql.org/pgsql-general/2006-10/msg01065.php
Mikel

8
Ця відповідь частина заплутана, а частина - неправильна. kill -9 1просто ігнорується в більшості уніцій. Там немає необхідності , щоб уникнути kill -9для mount, але немає сенсу в ньому теж. Я не знаю, що ви маєте на увазі під "зворотним порядком процесів". kill -9зупиняє процес (як і вбиває), не даючи йому можливості поскаржитися, проте вбивство не відбудеться негайно, якщо процес відбувається в системному виклику, що не переривається . Вбивство процесу за допомогою kill -9вивільняє більшість ресурсів, але не всі .
Жиль

5

Процеси вбивства мимоволі - це не плавний хід: дані можуть втрачатися, неякісно розроблені програми можуть ламати себе тонкими способами, які неможливо виправити без перевстановлення .. але це повністю залежить від того, що знати, що є, а що не безпечно в дана ситуація. і що було б під загрозою. Користувач повинен мати деяке уявлення про те, що процес, чи повинен бути, який процес і який це обмеження (диск IOPS, rss / swap) і бути в змозі оцінити, скільки часу повинен тривати тривалий процес (скажімо, копія файлу, перекодування mp3, міграція електронної пошти, резервне копіювання, [ваш улюблений посилання тут].)

Крім того, надсилання SIGKILLпіда не є гарантією його вбивства. Якщо він застряг у системному дзвінку або вже зомбізований ( Zв ps), він може продовжувати зомбі. Часто це стосується ^ Z тривалий запущений процес і забуття, bgперш ніж спробувати kill -9його. Простий fgпідключить stdin / stdout і, ймовірно, розблокує процес, як правило, після цього процес закінчується. Якщо він застряг в іншому місці або в іншій формі тупикового ядра, вилучити процес може лише перезавантаження. (Процеси зомбі вже мертві після того SIGKILL, як ядро ​​обробляється (більше не буде запущений код користувача), зазвичай причина ядра (подібно до того, що "заблокована", очікуючи завершення системного виклику), щоб процес не завершився.)

Крім того, якщо ви хочете вбити процес та всіх його дітей, ввійдіть у звичку дзвонити killза допомогою заперечуваного PID, а не лише самого PID . Там немає ніякої гарантії SIGHUP, SIGPIPEабо SIGINTчи інші сигнали очищення після нього, і з купою відрікся процесів в очищенні (пам'ятаєте дворняга?) Дратує.

Бонусне зло: kill -9 -1трохи більше шкодить, ніж kill -9 1(Не робіть жодного як корінця, якщо ви не хочете бачити, що відбувається на викидній, неважливій ВМ)


3

Чому ви не хочете kill -9нормально обробляти процес

Відповідно до man 7 signal:

Сигнали SIGKILL і SIGSTOP не можуть бути захоплені, заблоковані або проігноровані.

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

Що слід зробити перед запуском kill -9процесу

Ви повинні переконатися, що перш ніж надсилати сигнал в процес, який ви:

  1. Переконайтесь, що процес не зайнятий (тобто виконуючи "роботу"); надсилання в kill -9процес по суті призведе до втрати цих даних.
  2. Якщо процес є невідповідальною базою даних, переконайтеся, що він спочатку промив кеші. Деякі бази даних підтримують надсилання інших сигналів до процесу, щоб примусити прошивати кеш.

3

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

Він заснований на моїй повній відповіді 2 на запитання, дуже схоже на stackoverflow .

Всі пояснення ви можете прочитати там. Підводячи підсумки, я б рекомендував просто SIGTERMі SIGKILL, або навіть SIGTERM, SIGINTі SIGKILL. Однак я даю більше варіантів у повній відповіді.

Будь ласка, не соромтесь завантажувати (клонуйте) його з сховища github, щоб вбити граціозно 1

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