Tôi sẽ đăng bài này dưới dạng câu trả lời để có một số loại giải quyết nếu điều này hóa ra là vấn đề.
Trạng thái thoát là 0 nghĩa là thoát bình thường khỏi một chương trình thành công. Một chương trình thoát có thể chọn bất kỳ số nguyên nào trong khoảng từ 0 đến 255 làm trạng thái thoát của nó. Thông thường, các chương trình sử dụng các giá trị nhỏ. Các giá trị 126 trở lên được sử dụng bởi vỏ để báo cáo các điều kiện đặc biệt, vì vậy tốt nhất nên tránh chúng.
Ở cấp độ API C, các chương trình báo cáo trạng thái 16 bit¹ trạng thái mã hóa cả trạng thái thoát của chương trình và tín hiệu đã giết chết nó, nếu có.
Trong shell, trạng thái thoát của lệnh (được lưu trong $?
) sẽ xác nhận trạng thái thoát thực tế của chương trình và giá trị tín hiệu: nếu một chương trình bị giết bởi tín hiệu, $?
được đặt thành giá trị lớn hơn 128 (với hầu hết các shell, giá trị này là 128 cộng với số tín hiệu; ATT ksh sử dụng số tín hiệu 256 + và yash sử dụng số tín hiệu 384 +, để tránh sự mơ hồ, nhưng các vỏ khác không tuân theo).
Cụ thể, nếu $?
là 0, chương trình của bạn đã thoát bình thường.
Lưu ý rằng điều này bao gồm trường hợp một quá trình nhận SIGTERM, nhưng có bộ xử lý tín hiệu cho nó, và cuối cùng thoát ra bình thường (có lẽ là hậu quả gián tiếp của tín hiệu SIGTERM, có lẽ là không).
Để trả lời câu hỏi trong tiêu đề của bạn, SIGTERM không bao giờ được hệ thống tự động gửi. Có một vài tín hiệu được gửi tự động như SIGHUP khi thiết bị đầu cuối biến mất, SIGSEGV / SIGBUS / SIGILL khi một quy trình thực hiện những việc không nên làm, SIGPIPE khi nó ghi vào đường ống / ổ cắm bị hỏng, v.v. một vài tín hiệu được gửi do nhấn phím trong thiết bị đầu cuối, chủ yếu là SIGINT cho Ctrl+ C, SIGQUIT cho Ctrl+ \và SIGTSTP cho Ctrl+ Z, nhưng SIGTERM không phải là một trong số đó. Nếu một quy trình nhận được SIGTERM, một số quy trình khác đã gửi tín hiệu đó.
¹ khoảng nói