Я опубликую это как ответ, чтобы было какое-то решение, если это окажется проблемой.
Статус выхода 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, какой-то другой процесс отправил этот сигнал.
¹ грубо говоря