Я думаю, что, возможно, какое-то время делал это неправильно, потому что мы просто переключились на systemd, и он считает, что мой чисто убитый процесс завершился неудачно.
В основном я слушаю SIGHUP
, SIGINT
а также SIGTERM
а затем (передав код сигнала обратно до main
) чисто, например return 128+SIGHUP
,
Я ожидал, что это будет использоваться для заполнения $?
, но теперь я думаю, что понимаю, что оболочка отвечает за предоставление $?
такое значение, а затем только если сигнал был необработанным. Таким образом, даже если процесс завершился в конечном итоге из-за сигнала, потому что сигнал был обработан, $?
будет в конечном итоге 0
и все доказательства того, что сигнал имел какое-либо отношение к выходу, будут потеряны. Это правильно?
При обращении SIGHUP
и чисто выходя, я должен return EXIT_SUCCESS
от main
?
Конвенция о возвращении 128 + <signal number>
продвигается в руководстве Advanced Bash Scripting Guide среди других (https://stackoverflow.com/a/1535733/567292), но только для случая, когда ваша программа терпит неудачу в результате получения сигнала.
Если ваша программа получает сигнал, делает не обрабатывать его, и в результате завершается, статус выхода (как предусмотрено, например, wait
) будет аналогичным, но вместо установленного бита 7 будет установлен более высокий бит для указания WIFSIGNALED
в отличие от WIFEXITED
, Если вы работаете в оболочке, это тогда переведенный оболочкой дать статус выхода ($?
) в диапазоне 128-255 (т. е. с установленным битом 7), что касается сценария оболочки, программа возвращает 128+n
неотличима от завершения программы, потому что сигнал был обработан:
[…] При сообщении о состоянии выхода с помощью специального параметра ‘?’ Оболочка должна сообщать о всех восьми битах доступного состояния выхода. Состояние выхода команды, которая завершилась из-за получения сигнала, должно быть сообщено как более 128.
Если ваша программа получает сигнал, то успешно выходы, это считается успешным завершением, поэтому ваша программа должна вернуться EXIT_SUCCESS
,
Коды возврата обычно соответствуют указанным вами. Если вы хотите включить сигнал для кодов выхода, вы должны убедиться, что они по-прежнему остаются уникальными.
Если вам не нужен сигнал в коде выхода, кажется, нет смысла их включать.
Стоит ли возвращаться EXIT_SUCCESS
или же EXIT_FAILURE
зависит от вас / вашей программы, считается ли завершение успешным или неудачным.