Я опублікую це як відповідь, щоб було якесь рішення, якщо це виявиться проблемою.
Статус виходу 0 означає нормальний вихід із успішної програми. Вихідна програма може вибрати будь-яке ціле число між 0 і 255 як свій статус виходу. Зазвичай програми використовують малі значення. Значення 126 і вище використовуються оболонкою для повідомлення про особливі умови, тому краще уникати їх.
На рівні API 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, якийсь інший процес надсилає цей сигнал.
¹ грубо кажучи