亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Golang信號處理及如何實現進程的優雅退出詳解

2020-04-01 18:57:57
字體:
來源:轉載
供稿:網友

Linux系統中的信號類型

各操作系統的信號定義或許有些不同。下面列出了POSIX中定義的信號。

在linux中使用34-64信號用作實時系統中。

命令 man 7 signal 提供了官方的信號介紹。也可以是用kill -l來快速查看

列表中,編號為1 ~ 31的信號為傳統UNIX支持的信號,是不可靠信號(非實時的),編號為32 ~ 63的信號是后來擴充的,稱做可靠信號(實時信號)。不可靠信號和可靠信號的區別在于前者不支持排隊,可能會造成信號丟失,而后者不會。

Linux支持的標準信號有以下一些,一個信號有多個值的是因為不同架構使用的值不一樣,比如x86, ia64,ppc, s390, 有3個值的,第一個值是slpha和sparc,中間的值是 ix86,ia64, ppc, s390, arm和sh, 最后一個值是對mips的,連字符-表示這個架構是缺這個信號支持的,

第1列為信號名;

第2列為對應的信號值,需要注意的是,有些信號名對應著3個信號值,這是因為這些信號值與平臺相關,將man手冊中對3個信號值的說明摘出如下,the first one is usually valid for alpha and sparc, the middle one for i386, ppc and sh, and the last one for mips.

第3列為操作系統收到信號后的動作,Term表明默認動作為終止進程,Ign表明默認動作為忽略該信號,Core表明默認動作為終止進程同時輸出core dump,Stop表明默認動作為停止進程。

第4列為對信號作用的注釋性說明。

標準信號-POSIX.1-1990定義

 Signal Value Action Comment ---------------------------------------------------------------------- SIGHUP 1 Term Hangup detected on controlling terminal     or death of controlling process SIGINT 2 Term Interrupt from keyboard SIGQUIT 3 Core Quit from keyboard SIGILL 4 Core Illegal Instruction SIGABRT 6 Core Abort signal from abort(3) SIGFPE 8 Core Floating point exception SIGKILL 9 Term Kill signal SIGSEGV 11 Core Invalid memory reference SIGPIPE 13 Term Broken pipe: write to pipe with no     readers SIGALRM 14 Term Timer signal from alarm(2) SIGTERM 15 Term Termination signal SIGUSR1 30,10,16 Term User-defined signal 1 SIGUSR2 31,12,17 Term User-defined signal 2 SIGCHLD 20,17,18 Ign Child stopped or terminated SIGCONT 19,18,25 Cont Continue if stopped SIGSTOP 17,19,23 Stop Stop process SIGTSTP 18,20,24 Stop Stop typed at tty SIGTTIN 21,21,26 Stop tty input for background process SIGTTOU 22,22,27 Stop tty output for background process

SIGKILL和SIGSTOP信號是不能被捕獲,阻塞和忽略的。

標準信號-SUSv2 and POSIX.1-2001定義

 Signal Value Action Comment -------------------------------------------------------------------- SIGBUS 10,7,10 Core Bus error (bad memory access) SIGPOLL   Term Pollable event (Sys V).     Synonym for SIGIO SIGPROF 27,27,29 Term Profiling timer expired SIGSYS 12,-,12 Core Bad argument to routine (SVr4) SIGTRAP 5 Core Trace/breakpoint trap SIGURG 16,23,21 Ign Urgent condition on socket (4.2BSD) SIGVTALRM 26,26,28 Term Virtual alarm clock (4.2BSD) SIGXCPU 24,24,30 Core CPU time limit exceeded (4.2BSD) SIGXFSZ 25,25,31 Core File size limit exceeded (4.2BSD)

早在Linux 2.2SIGSYS, SIGXCPU, SIGXFSZ和SIGBUS(非sparc和mips架構)的默認操作就是終止進程(但是不產生coredump)

在一些unix系統中SIGXCPU和SIGXFSZ信號是用來終止進程的,也是不產生coredunp,從Linux 2.4開始這些信號會產生coredump了。

標準信號-其它信號

  Signal  Value  Action Comment  --------------------------------------------------------------------  SIGIOT   6  Core IOT trap. A synonym for SIGABRT  SIGEMT  7,-,7  Term  SIGSTKFLT -,16,-  Term Stack fault on coprocessor (unused)  SIGIO  23,29,22 Term I/O now possible (4.2BSD)  SIGCLD  -,-,18  Ign  A synonym for SIGCHLD  SIGPWR  29,30,19 Term Power failure (System V)  SIGINFO  29,-,-    A synonym for SIGPWR  SIGLOST  -,-,-  Term File lock lost  SIGWINCH 28,28,20 Ign  Window resize signal (4.3BSD, Sun)  SIGUNUSED -,31,-  Term Unused signal (will be SIGSYS)

信號29是在alpha中是 SIGINFO或SIGPWR,但是在sparc中是SIGLOST。

SIGEMT沒有在POSIX.1-2001中定義, 但是在大多數Unix戲中是沒有的,他的默認處理方式是coredump并且終止進程。
SIGPWR(沒有在POSIX.1-2001中定義)他的默認處理方式是忽略。

SIGIO(沒有在POSIX.1-2001中定義)在一些Unix系統中的處理方式也是忽略。

kill pid的作用是向進程號為pid的進程發送SIGTERM(這是kill默認發送的信號),該信號是一個結束進程的信號且可以被應用程序捕獲。若應用程序沒有捕獲并響應該信號的邏輯代碼,則該信號的默認動作是kill掉進程。這是終止指定進程的推薦做法。

kill -9 pid則是向進程號為pid的進程發送SIGKILL(該信號的編號為9),從本文上面的說明可知,SIGKILL既不能被應用程序捕獲,也不能被阻塞或忽略,其動作是立即結束指定進程。通俗地說,應用程序根本無法“感知”SIGKILL信號,它在完全無準備的情況下,就被收到SIGKILL信號的操作系統給干掉了,顯然,在這種“暴力”情況下,應用程序完全沒有釋放當前占用資源的機會。事實上,SIGKILL信號是直接發給init進程的,它收到該信號后,負責終止pid指定的進程。在某些情況下(如進程已經hang死,無法響應正常信號),就可以使用kill -9來結束進程。

若通過kill結束的進程是一個創建過子進程的父進程,則其子進程就會成為孤兒進程(Orphan Process),這種情況下,子進程的退出狀態就不能再被應用進程捕獲(因為作為父進程的應用程序已經不存在了),不過應該不會對整個linux系統產生什么不利影響。

Go中的信號發送和處理

有時候我們想在Go程序中處理Signal信號,比如收到 SIGTERM 信號后優雅的關閉程序(參看下一節的應用)。Go信號通知機制可以通過往一個channel中發送 os.Signal 實現。首先我們創建一個os.Signal channel,然后使用 signal.Notify 注冊要接收的信號。

package mainimport ( "fmt" "os" "os/signal" "syscall")func main() { sigs := make(chan os.Signal, 1) done := make(chan bool, 1) // signal.Notify(c) signal.Notify(sigs, os.Interrupt, os.Kill, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGINT, syscall.SIGTERM) go func() { sig := <-sigs fmt.Println(sig) done <- true }() fmt.Println("wait for signal") <- done fmt.Println("got signal and exit") fmt.Println("run done")}

如何實現進程的優雅退出

首先什么是優雅退出呢?所謂的優雅退出,其實就是避免暴力殺死進程,讓進程在接收到信號之后,自動的做一些善后處理,再自己自愿的退出。

Linux Server端的應用程序經常會長時間運行,在運行過程中,可能申請了很多系統資源,也可能保存了很多狀態,在這些場景下,我們希望進程在退出前,可以釋放資源或將當前狀態dump到磁盤上或打印一些重要的日志,也就是希望進程優雅退出(exit gracefully)。

從上面的介紹不難看出,優雅退出可以通過捕獲SIGTERM來實現。具體來講,通常只需要兩步動作:

1)注冊SIGTERM信號的處理函數并在處理函數中做一些進程退出的準備。信號處理函數的注冊可以通過signal()sigaction()來實現,其中,推薦使用后者來實現信號響應函數的設置。信號處理函數的邏輯越簡單越好,通常的做法是在該函數中設置一個bool型的flag變量以表明進程收到了SIGTERM信號,準備退出。

2)在主進程的main()中,通過類似于while(!bQuit)的邏輯來檢測那個flag變量,一旦bQuit在signal handler function中被置為true,則主進程退出while()循環,接下來就是一些釋放資源或dump進程當前狀態或記錄日志的動作,完成這些后,主進程退出。

這個在我前面的一篇文章中也介紹過【=[golang/71386.html">golang/254229.html">golang的httpserver優雅重啟][1]】http://www.49028c.com/article/137069.htm,里面介紹了一般我們使用的httpserver如何做到優雅重啟,這里面也介紹了一些信號的使用,和優雅重啟的思路。今天這里我們介紹的是如何優雅退出,其實是優雅重啟的一個簡化版。

package mainimport ( "fmt" "os" "os/signal" "syscall" "time") func main() { sigs := make(chan os.Signal, 1) // done := make(chan bool, 1)  // signal.Notify(sigs) // signal.Notify(sigs, os.Interrupt, os.Kill, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGINT, syscall.SIGTERM) signal.Notify(sigs, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT)  // go func() { // sig := <-sigs // fmt.Println(sig) // done <- true // }() go func() { for s := range sigs { switch s { case syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT: fmt.Println("got signal and try to exit: ", s) do_exit() case syscall.SIGUSR1: fmt.Println("usr1: ", s) case syscall.SIGUSR2: fmt.Println("usr2: ", s) default: fmt.Println("other: ", s) } } }()   fmt.Println("wait for signal") i := 0 for { i++ fmt.Println("times: ", i) time.Sleep(1 * time.Second) } // <- done fmt.Println("got signal and exit") fmt.Println("run done")} func do_exit() { fmt.Println("try do some clear jobs") fmt.Println("run done") os.Exit(0)}
kill -USR1 pid usr1 user defined signal 1 kill -USR2 pid usr2 user defined signal 2 kill -QUIT pid got signal and try to exit: quittry do some clear jobsrun done

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久综合久久八八| 欧美体内谢she精2性欧美| 日韩女在线观看| 日韩精品在线私人| 国产精品香蕉av| 国产精品久久不能| 亚洲视频精品在线| 欧美洲成人男女午夜视频| 国产一区二中文字幕在线看| 96精品久久久久中文字幕| 欧美wwwwww| 亚洲午夜色婷婷在线| 日韩av最新在线观看| 黄色成人在线免费| 欧美成人全部免费| 国产成人亚洲综合91精品| 日韩精品中文在线观看| 国产精品中文字幕在线观看| 中文字幕日韩精品在线观看| 成人国产精品久久久| 国产精品中文字幕在线观看| 亚洲国产美女精品久久久久∴| 欧美伦理91i| 热re99久久精品国产66热| 亚洲国产成人一区| 久久久97精品| 中文字幕免费精品一区高清| 国产91ⅴ在线精品免费观看| 亚洲第一中文字幕在线观看| 欧美激情喷水视频| 亚洲最大的成人网| 国产精品爽爽ⅴa在线观看| 国产欧美日韩中文字幕| 久久av资源网站| 久久久久亚洲精品国产| 国产精品www色诱视频| 亚洲精品成人久久| 亚洲欧美日韩中文在线制服| 欧亚精品中文字幕| 久久成人这里只有精品| 久久久精品国产亚洲| www国产精品视频| 欧美国产中文字幕| 91久久精品一区| 国产精品免费久久久久久| 亚洲国产精品女人久久久| 亚洲国产欧美一区二区三区同亚洲| 久久久亚洲福利精品午夜| 91伊人影院在线播放| 亚洲另类欧美自拍| 国产免费一区视频观看免费| 97在线看免费观看视频在线观看| 成人激情综合网| 国产69精品久久久久9999| 欧美激情啊啊啊| 色婷婷综合久久久久中文字幕1| 日韩视频―中文字幕| 日韩av快播网址| 国模精品系列视频| 成人黄色在线播放| 国产欧美婷婷中文| 在线观看国产成人av片| 日韩美女视频免费看| 亚洲第一免费播放区| 日韩网站在线观看| 亚洲精品欧美日韩专区| 狠狠久久五月精品中文字幕| 国产日产久久高清欧美一区| 亚洲精品欧美日韩专区| 欧美日韩中文字幕日韩欧美| 亚洲自拍另类欧美丝袜| 91色p视频在线| 久久6免费高清热精品| 亚洲男人的天堂网站| 国模视频一区二区三区| 欧美激情国产高清| 欧美性高潮床叫视频| 欧美国产在线电影| 亚洲色图av在线| 欧美日韩亚洲一区二| 欧美午夜精品伦理| 国产欧美va欧美va香蕉在| 国产精品视频在线播放| 性金发美女69hd大尺寸| 亚洲一区999| 国产区亚洲区欧美区| 国产精品久久婷婷六月丁香| 影音先锋日韩有码| 国产精品美女久久久久av超清| www国产91| 日韩毛片在线观看| 日韩在线视频二区| 成人春色激情网| 日韩亚洲一区二区| 欧美国产精品va在线观看| 久久久99久久精品女同性| 久久久久99精品久久久久| 日韩精品一二三四区| 国产自产女人91一区在线观看| 亚洲欧美日韩成人| 日本国产一区二区三区| 国产精品久久久久免费a∨大胸| 国产亚洲一区二区精品| 久久精品99久久久香蕉| 国产精品第一区| 成人性生交大片免费看小说| 成人写真视频福利网| 精品国偷自产在线| 亚洲国产中文字幕久久网| 欧美一级bbbbb性bbbb喷潮片| 欧美日韩国产中文字幕| 91精品国产91久久久久福利| 亚洲欧洲日产国码av系列天堂| 搡老女人一区二区三区视频tv| 美女精品久久久| 亚洲国产精品字幕| 成人黄色av播放免费| 欧美在线一区二区视频| 国产成人啪精品视频免费网| 亚洲视频在线免费观看| 国产精品视频久久久| 亚洲xxx自由成熟| 午夜精品99久久免费| 精品视频在线播放色网色视频| 成人在线中文字幕| 欧美激情一区二区三级高清视频| 欧美激情va永久在线播放| 欧美成人精品三级在线观看| 久久伊人91精品综合网站| 91精品视频观看| 成人久久一区二区| 国产成人在线播放| 日本精品一区二区三区在线播放视频| 亚洲一区二区自拍| 日韩不卡中文字幕| 欧美自拍大量在线观看| 亚洲欧美在线一区| 日韩av中文字幕在线| 久久91精品国产| 国产精品揄拍500视频| 国产亚洲精品美女久久久久| 国产精欧美一区二区三区| 久久久久亚洲精品国产| 欧美成年人视频| 大伊人狠狠躁夜夜躁av一区| 欧美老女人bb| 日韩av免费看网站| 欧美成人四级hd版| 亚洲国产精品电影| 久久国产精品影视| 国外成人免费在线播放| 日韩经典中文字幕在线观看| 精品日韩视频在线观看| 亚洲国产精品电影在线观看| 国a精品视频大全| 亚洲电影免费观看高清完整版在线| 欧美日韩亚洲激情| 国产视频久久网| 亚洲一区二区三区xxx视频| 国产拍精品一二三| 北条麻妃一区二区三区中文字幕| yellow中文字幕久久| 精品亚洲aⅴ在线观看| 国产综合香蕉五月婷在线|