Saya akan memposting ini sebagai jawaban sehingga ada semacam penyelesaian jika ternyata ini masalahnya.
Status keluar 0 berarti keluar normal dari program yang berhasil. Program yang keluar dapat memilih bilangan bulat antara 0 dan 255 sebagai status keluarnya. Secara konvensional, program menggunakan nilai kecil. Nilai 126 dan di atasnya digunakan oleh shell untuk melaporkan kondisi khusus, jadi sebaiknya hindari.
Pada level C API, program melaporkan status 16-bit¹ yang mengenkode status keluar program dan sinyal yang mematikannya, jika ada.
Di shell, status keluar perintah (disimpan di $?
) menggabungkan status keluar sebenarnya dari program dan nilai sinyal:jika program dimatikan oleh sinyal, $?
diatur ke nilai lebih besar dari 128 (dengan sebagian besar cangkang, nilai ini adalah 128 ditambah nomor sinyal; ATT ksh menggunakan 256 + nomor sinyal dan yash menggunakan 384 + nomor sinyal, yang menghindari ambiguitas, tetapi cangkang lain tidak mengikuti setelan).
Secara khusus, jika $?
adalah 0, program Anda keluar secara normal.
Perhatikan bahwa ini termasuk kasus proses yang menerima SIGTERM, tetapi memiliki penangan sinyal untuknya, dan akhirnya keluar secara normal (mungkin sebagai konsekuensi tidak langsung dari sinyal SIGTERM, mungkin tidak).
Untuk menjawab pertanyaan di judul Anda, SIGTERM tidak pernah dikirimkan secara otomatis oleh sistem. Ada beberapa sinyal yang dikirim secara otomatis seperti SIGHUP saat terminal hilang, SIGSEGV/SIGBUS/SIGILL saat proses melakukan hal-hal yang seharusnya tidak dilakukan, SIGPIPE saat menulis ke pipa/soket yang rusak, dll. beberapa sinyal yang dikirim karena penekanan tombol di terminal, terutama SIGINT untuk Ctrl +C , SIGQUIT untuk Ctrl +\ dan SIGTSTP untuk Ctrl +Z , tetapi SIGTERM bukan salah satunya. Jika suatu proses menerima SIGTERM, beberapa proses lain mengirimkan sinyal itu.
¹ secara kasar
SIGTERM adalah sinyal yang biasanya digunakan untuk menghentikan proses secara administratif.
Itu bukan sinyal yang akan dikirim oleh kernel, tetapi itu adalah sinyal yang biasanya dikirim oleh suatu proses untuk menghentikan (dengan anggun) proses lain.
Itulah sinyal yang dikirim secara default oleh kill
, pkill
, killall
... perintah.
Itulah sinyal yang dikirim ke daemon untuk menghentikannya (seperti pada service some-service stop
), atau dikirim melalui init
sebelum dimatikan (diikuti oleh SIGKILL untuk proses yang belum berhasil dihentikan tepat waktu setelah SIGTERM).
Perhatikan bahwa SIGTERM bukan sinyal yang dikirim melalui ^C
. Sinyal dikirim melalui ^C
adalah SIGINT.