⌨ Labor omnia vincit ☮

SIGTERM != SIGKILL

Posted in GNU/Linux by anaumov on 09.06.2011

Мы все знаем, что произойдет в UNIX/Linux системе, если мы сделаем

> kill 4055

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

> kill -9 4055

В чем разница? Это очень интересный момент, давайте рассмотрим его поподробнее. Программа kill по умолчанию шлет сигнал SIGTERM. Именно этот сигнал предназначен для завершения процесса, и в штатной ситуации процесс, получивший этот сигнал, завершается (см. man kill). Что именно должен сделать процесс описанно в файле signal.h стандартной библиотеки С.

Итак, что же произойдет, если процесс получит сигнал SIGTERM?

  • процесс может сразу же завершиться
  • процесс может завершиться после освобождения используемых ресурсов
  • процесс может проигнорировать полученный сигнал и продолжать работать🙂

Процесс сам обрабатывает полученный сигнал и сам решает, что ему делать. Как правило это освобождение используемых ресурсов (корректное завершение) и завершение, но иногда по той или иной причине процесс не может корректно завершиться. Иногда программа может быть написанна так, что при получении сигнала о завершении, она начнет делать что-то другое. Именно тут приходит на помощь ключ -9. При его использовании kill шлет другой сигнал – SIGKILL.
В этом случае нам все равно как написанна программа, которой мы отправляем этот сигнал, и как она будет обрабатывать полученный сигнал и т.д. Этот сигнал не может быть проигнорирован, так что процесс будет сражу же убит.

Почему SIGTERM может быть проигнорирован, а SIGKILL нет? Дело в том, что процесс вообще не получает сигнал SIGKILL, следовательно не может его обработать или попытаться что-то сделать, когда вы хотите его завершить. Его получает процесс init (pid 1) и уже он завершает процесс.

Надо также сказать, что даже использование сигнала SIGKILL, который не может быть проигнорирован, не всегда может помочь. Дело в том, что, например, зомби-процессы уже теоретически являются убиитыми (флаг “Z” в колонке STAT, при выводе ps), следовательно не могут принимать сигналы. Убрать их из системы может только родительский процесс, либо его завершение… либо перезагрузка операционной системы.

Этот вопрос задают на собеседовании при устройстве на работу в Google😉

5 Responses

Subscribe to comments with RSS.

  1. tuoma said, on 22.06.2011 at 14:49

    круто!
    думал, ничего особенного, пока не дочитал про прием на работу в Гугл😀

    • Alex said, on 24.06.2011 at 19:07

      Да, ничего особенного для тех, кто думает, что сигнал для убийства процесса, отправляемый этому процессу, называется SIGKILL.

      • tuoma said, on 25.06.2011 at 08:27

        ничего особенного для тех, кто знает команду man. Ну в посте собственно самое инетерсное, что такой одновременно сложный и простой вопрос задается при собеседовании в гугл

      • Alex said, on 26.06.2011 at 23:16

        Думаю, что команда man не сильно поможет во время собеседования🙂

  2. tuoma said, on 27.06.2011 at 13:37

    На собеседовании ничего не поможет, кроме собственных знаний🙂 но ведь суть не в этом? суть в том, что такой казалось бы на самом деле несложный вопрос задается на собседеовании в гугл🙂


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: