Когда система отправляет SIGTERM в процесс?

Моя серверная программа получила SIGTERM и остановилась (с кодом выхода 0). Я удивлен этим, так как я уверен, что для этого было много памяти. При каких условиях linux (busybox) отправляет SIGTERM в процесс?

  • Как понять, почему пакет считался INVALID `iptables`?
  • Схема пассирования: сервер и ноутбук Arch Linux
  • Цифры с нулевым заполнением до 2 цифр с помощью sed
  • почему команда linux cp не потребляет диск IO?
  • Могу ли я использовать один и тот же двоичный файл в Linux, * BSD и Illumos?
  • Мобильный Jolla портирован на Nokia N9
  • Как повернуть микрофонный разъем в гнездо для наушников?
  • Может ли что-либо из пространства ядра отложить переход в состояние питания S3?
  • Почему вы не должны редактировать файл конфигурации ядра .config?
  • Linux не может компилироваться без оптимизации GCC; последствия?
  • Arch linux wifi работает вручную, как сделать его автоматическим?
  • Могут ли правила iptables манипулировать наборами IP-адресов?
  • 2 Solutions collect form web for “Когда система отправляет SIGTERM в процесс?”

    Я отправлю это как ответ, так что есть какая-то резолюция, если это окажется проблемой.

    Статус выхода 0 означает нормальный выход из успешной программы. Выходящая программа может выбрать любое целое число от 0 до 255 в качестве статуса выхода. Обычно программы используют небольшие значения. Значения 126 и выше используются оболочкой для сообщения о специальных условиях, поэтому лучше избегать их.

    На уровне C API программы сообщают о 16-разрядном статусе¹, который кодирует как статус выхода программы, так и сигнал, который ее убил, если таковой имеется.

    В оболочке статус выхода команды (сохраненный в $? ) Связывает фактический статус выхода программы и значение сигнала: если программа убита сигналом, $? установленное значение больше 128 (с большинством оболочек это значение равно 128 плюс номер сигнала, ATT ksh использует 256 + номер сигнала, а yash использует 384 + номер сигнала, что позволяет избежать неоднозначности, но другие оболочки не соблюдались костюм).

    В частности, если $? 0, ваша программа вышла нормально.

    Обратите внимание, что это относится к процессу, который получает SIGTERM, но имеет обработчик сигнала для него и, в конечном счете, выходит из него (возможно, как косвенное следствие сигнала SIGTERM, возможно, нет).


    Чтобы ответить на вопрос в вашем названии, SIGTERM никогда не отправляется автоматически системой. Есть несколько сигналов, которые отправляются автоматически, например, SIGHUP, когда терминал уходит, SIGSEGV / SIGBUS / SIGILL, когда процесс делает то, чего он не должен делать, SIGPIPE, когда он пишет в сломанный канал / сокет и т. Д. И есть несколько сигналов, которые отправляются из-за нажатия клавиши в терминале, в основном SIGINT для Ctrl + C , SIGQUIT для Ctrl + \ и SIGTSTP для Ctrl + Z , но SIGTERM не является одним из них. Если процесс получает SIGTERM, какой-то другой процесс отправил этот сигнал.

    ¹ грубо говоря

    SIGTERM – это сигнал, который обычно используется для административного завершения процесса.

    Это не сигнал, посылаемый ядром, но это сигнал, который процесс обычно посылает для завершения (изящно) другого процесса.

    Это сигнал, который по умолчанию pkill kill , pkill , killall , fuser -k ….

    Это сигнал, который отправляется демонам, чтобы остановить их (например, при остановке service some-service stop ) или отправлен init перед завершением работы (за ним следует SIGKILL для тех процессов, которые не удалось завершить во время SIGTERM).

    Обратите внимание, что SIGTERM не является сигналом, который отправляется на ^C Сигналом, посылаемым на ^C является SIGINT.

    Linux и Unix - лучшая ОС в мире.