Обе команды остановили выгрузку, но одна дала ей закончить работу, а другая оборвала. В этом шаге — чем они отличаются.
kill посылает процессу сигнал — короткое сообщение с номером и именем. Что делать с сигналом, решает программа, а несколько сигналов решает ядро:
| Сигнал | Что делает |
|---|---|
| TERM (15) | просит завершиться; его посылает kill без ключа |
| INT (2) | прерывает; его посылает Ctrl+C |
| KILL (9) | ядро завершает процесс сразу, программа ничего не успевает |
На TERM программа может ответить по-своему: дописать данные, закрыть файлы и выйти. Выгрузка a так и сделала — дописала saved и завершилась, а оболочка сообщила Done. KILL программа не видит: ядро обрывает процесс там, где его застал сигнал, и оболочка пишет Killed.
Сигнал называют именем или номером: kill -9, kill -KILL и kill -s KILL — одно и то же. Весь список печатает kill -l.
kill 2345 выполнился без ошибки, но через пять секунд ps -p 2345 всё ещё показывает процесс. Что сделаешь?
-
Второй TERM — та же просьба: программа уже знает, что её просят завершиться. Проверь
ps -p 2345через несколько секунд. -
Перезагрузка оборвёт все программы машины. Сначала дай процессу закончить работу и проверь
ps -p 2345снова. -
TERM — просьба: программа может ещё дописывать данные.
kill -9оборвёт её посреди записи, как выгрузку b.
На TERM программа может завершаться не сразу: дописывать данные и закрывать файлы. KILL оставляют на случай, когда процесс так и не завершился, — недописанное тогда пропадёт.
Главное в шаге
-
killбез ключа посылает TERM — просьбу завершиться, на которую программа может сохранить работу. -
kill -9(KILL) завершает процесс сразу: недописанное пропадает. - Поэтому сначала TERM, а KILL — когда процесс не завершается сам.