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

Принятие Вас хочет поместить конечный тег PHP в файлы, затем

sed -i '$s/$/\n?>/' file

должен добиться цели

24
23.05.2017, 20:12
2 ответа

Я отправлю это как ответ так, чтобы было некоторое разрешение, если это оказывается проблемой.

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

На уровне API C программы сообщают о 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, некоторый другой процесс отправил тот сигнал.

¹ примерно разговор

14
27.01.2020, 19:41
  • 1
    Хорошее объяснение того, как статус выхода определяется после получения сигнала. Однако этот ответ не рассматривает вопрос OP. –  codeforester 23.05.2017, 19:29
  • 2
    @codeforester использования, я ответил на вопрос в теле, не вопрос в заголовке. Ну, один из вопросов в теле — учитывая, что это было основано на недоразумении, это немного грязно. Я добавлю несколько слов об остальных. –  Gilles 'SO- stop being evil' 23.05.2017, 23:43
  • 3
    Это зависит от оболочки. В ksh93 это 256+signum в yash, это 384+signum, –  Stéphane Chazelas 24.05.2017, 00:00
  • 4
    Обратите внимание, что с помощью значения выше 256 а-ля ksh не обязательно лучше, поскольку это предотвращает то, чтобы он был переданным exit. yash подход является хорошим компромиссом, но посмотрите дистанционное управление для другого. См. также код выхода По умолчанию, когда процесс будет завершен? –  Stéphane Chazelas 24.05.2017, 00:59

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

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

Это сигнал, который по умолчанию отправляется командами kill, pkill, killall...

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

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

20
27.01.2020, 19:41

Теги

Похожие вопросы