Python中的signal模塊處理OS級別的信號。例如Ctrl+C會進程發送信號。bash
參考這裏:http://www.javashuo.com/article/p-azwmnisg-eo.htmlapp
Linux上查看信號的方法:ui
[appadmin@BJLTPGPLM1007T ~]$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX [appadmin@BJLTPGPLM1007T ~]$
Python中要捕獲信號,須要signal包來處理。.net
幾個經常使用信號:
SIGINT 終止進程 中斷進程 (control+c)
SIGTERM 終止進程 軟件終止信號
SIGKILL 終止進程 殺死進程
SIGALRM 鬧鐘信號
線程
進程結束信號 SIGTERM和SIGKILL的區別
SIGTERM比較友好,進程能捕捉這個信號,根據您的須要來關閉程序。在關閉程序以前,您能夠結束打開的記錄文件和完成正在作的任務。在某些狀況下,假如進程正在進行做業並且不能中斷,那麼進程能夠忽略這個SIGTERM信號。
對於SIGKILL信號,進程是不能忽略的。這是一個 「我無論您在作什麼,馬上中止」的信號。假如您發送SIGKILL信號給進程,Linux就將進程中止在那裏。code
發送信號通常有兩種緣由:
1(被動式) 內核檢測到一個系統事件.例如子進程退出會像父進程發送SIGCHLD信號.鍵盤按下control+c會發送SIGINT信號
2(主動式) 經過系統調用kill來向指定進程發送信號
blog
綁定信號,這裏以Ctrl+C舉例,它會向進程發出中斷信號。進程
import signal def quit_signal_handler(signum,frame): pass signal.signal(signal.SIGINT,quit_signal_handler)
關於Ctrl+C,實際工做中遇到一個問題,與thread/threading有關。事件
線程實現的兩種方式: thread.start_new_thread和threading.Thread(target=xxx,args=(xxx)).start()。get
作Ctrl+C操做時,若是子線程使用第二種方法發起,那麼若是子線程不結束,Ctrl+C中不管是作sys.exit或者os._exit操做,應用都沒法退出,而使用第一種方法,則能夠結束。