Câu trả lời ngắn : Gửi SIGTERM
, 30 giây sau SIGKILL
,. Tức là gửi đi SIGTERM
, đợi một chút (tùy từng chương trình có thể khác nhau, bạn có thể hiểu rõ hệ thống của mình hơn nhưng 5 đến 30 giây là đủ. Khi tắt máy, bạn có thể thấy máy tự động chờ đến 1'30 giây). Rốt cuộc tại sao lại vội vàng?), Sau đó gửi đi SIGKILL
.
Hợp lý trả lời : SIGTERM
, SIGINT
, SIGKILL
Đây là quá đủ. Quá trình này rất có thể sẽ kết thúc trước đó SIGKILL
.
Dài trả lời : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
,SIGKILL
Điều này là không cần thiết, nhưng ít nhất bạn không làm sai quy trình liên quan đến thông điệp của bạn. Tất cả những tín hiệu này có nghĩa là bạn muốn quá trình dừng những gì nó đang làm và thoát ra.
Cho dù bạn chọn câu trả lời nào từ lời giải thích này, hãy ghi nhớ điều đó!
Nếu bạn gửi một tín hiệu có nghĩa là một cái gì đó khác, quy trình có thể xử lý nó theo những cách rất khác nhau (một mặt). Mặt khác, nếu tiến trình không xử lý tín hiệu, thì cuối cùng bạn gửi gì cũng không quan trọng, tiến trình sẽ thoát bằng cách nào (tất nhiên khi hành động mặc định là kết thúc).
Vì vậy, bạn phải suy nghĩ như chính mình với tư cách là một lập trình viên. Bạn sẽ viết mã một trình xử lý hàm, chẳng hạn, SIGHUP
để thoát khỏi một chương trình kết nối với thứ gì đó, hay bạn sẽ lặp lại nó để thử kết nối lại? Đó là câu hỏi chính ở đây! Đó là lý do tại sao điều quan trọng là chỉ gửi tín hiệu có nghĩa là những gì bạn dự định.
Câu trả lời dài gần như ngu ngốc :
Bảng dưới đây chứa các tín hiệu liên quan và các hành động mặc định trong trường hợp chương trình không xử lý chúng.
Tôi đã đặt hàng chúng theo thứ tự mà tôi đề nghị sử dụng (BTW, tôi đề nghị bạn sử dụng câu trả lời hợp lý , không phải câu trả lời này ở đây), nếu bạn thực sự cần thử tất cả chúng (sẽ rất vui khi nói rằng bảng được sắp xếp theo thứ tự sự phá hủy chúng có thể gây ra, nhưng điều đó không hoàn toàn đúng).
Các tín hiệu có dấu hoa thị (*) KHÔNG được khuyến khích. Điều quan trọng là bạn có thể không bao giờ biết nó được lập trình để làm gì. Đặc biệt SIGUSR
! Nó có thể bắt đầu apocalipse (đó là một tín hiệu miễn phí cho một lập trình viên làm bất cứ điều gì anh ấy / cô ấy muốn!). Nhưng, nếu không được xử lý HOẶC trong trường hợp không chắc nó được xử lý để chấm dứt, chương trình sẽ chấm dứt.
Trong bảng, các tín hiệu với các tùy chọn mặc định để kết thúc và tạo ra một kết xuất lõi được để lại cuối cùng, ngay trước đó SIGKILL
.
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
Sau đó, tôi sẽ đề nghị cho điều này câu trả lời dài gần ngu ngốc :
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGQUIT
, SIGABRT
,SIGKILL
Và cuối cùng,
Câu trả lời chắc chắn là ngu ngốc .
Đừng thử điều này ở nhà.
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, SIGQUIT
, SIGABRT
, SIGSEGV
, SIGILL
, SIGFPE
Và nếu không có gì làm việc, SIGKILL
.
SIGUSR2
nên được thử trước SIGUSR1
vì chúng tôi tốt hơn nếu chương trình không xử lý tín hiệu. Và nhiều khả năng nó sẽ xử lý được SIGUSR1
nếu nó chỉ xử lý một trong số chúng.
BTW, the KILL : không sai khi gửi SIGKILL
đến một quy trình, như câu trả lời khác đã nêu. Hãy nghĩ xem điều gì sẽ xảy ra khi bạn gửi một shutdown
lệnh? Nó sẽ cố gắng SIGTERM
và SIGKILL
duy nhất. Bạn nghĩ tại sao lại như vậy? Và tại sao bạn cần bất kỳ tín hiệu nào khác, nếu shutdown
lệnh chỉ sử dụng hai tín hiệu này?
Bây giờ, trở lại câu trả lời dài , đây là một câu trả lời hay:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
Nó ngủ trong 30 giây giữa các tín hiệu. Tại sao bạn lại cần một tấm lót ? ;)
Ngoài ra, khuyến nghị: hãy thử nó chỉ với các tín hiệu 15 2 9
từ câu trả lời hợp lý .
an toàn : loại bỏ thứ hai echo
khi bạn đã sẵn sàng để đi. Tôi gọi nó là của tôi dry-run
cho những người trực tuyến . Luôn sử dụng nó để kiểm tra.
Viết kịch bản một cách đáng tiếc
Trên thực tế, tôi bị hấp dẫn bởi câu hỏi này nên tôi quyết định tạo một kịch bản nhỏ để làm điều đó. Vui lòng tải xuống (sao chép) nó tại đây:
Liên kết GitHub đến kho lưu trữ Killgraceently