亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出詳解

Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出詳解

熱門標(biāo)簽:浙江高頻外呼系統(tǒng)多少錢一個月 濱州自動電銷機器人排名 鄭州亮點科技用的什么外呼系統(tǒng) 汕頭小型外呼系統(tǒng) 釘釘有地圖標(biāo)注功能嗎 建造者2地圖標(biāo)注 黃岡人工智能電銷機器人哪個好 阿里云ai電話機器人 惠州電銷防封電話卡

Linux系統(tǒng)中的信號類型

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

在linux中使用34-64信號用作實時系統(tǒng)中。

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

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

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

第1列為信號名;

第2列為對應(yīng)的信號值,需要注意的是,有些信號名對應(yīng)著3個信號值,這是因為這些信號值與平臺相關(guān),將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列為操作系統(tǒng)收到信號后的動作,Term表明默認(rèn)動作為終止進程,Ign表明默認(rèn)動作為忽略該信號,Core表明默認(rèn)動作為終止進程同時輸出core dump,Stop表明默認(rèn)動作為停止進程。

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

標(biāo)準(zhǔn)信號-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信號是不能被捕獲,阻塞和忽略的。

標(biāo)準(zhǔn)信號-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架構(gòu))的默認(rèn)操作就是終止進程(但是不產(chǎn)生coredump)

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

標(biāo)準(zhǔn)信號-其它信號

  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中定義, 但是在大多數(shù)Unix戲中是沒有的,他的默認(rèn)處理方式是coredump并且終止進程。
SIGPWR(沒有在POSIX.1-2001中定義)他的默認(rèn)處理方式是忽略。

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

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

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

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

Go中的信號發(fā)送和處理

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

package main
import (
 "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")
}

如何實現(xiàn)進程的優(yōu)雅退出

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

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

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

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

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

這個在我前面的一篇文章中也介紹過【=[golang的httpserver優(yōu)雅重啟][1]】https://www.jb51.net/article/137069.htm,里面介紹了一般我們使用的httpserver如何做到優(yōu)雅重啟,這里面也介紹了一些信號的使用,和優(yōu)雅重啟的思路。今天這里我們介紹的是如何優(yōu)雅退出,其實是優(yōu)雅重啟的一個簡化版。

package main
import (
 "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: quit
try do some clear jobs
run done

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • golang監(jiān)聽文件變化的實例
  • golang使用信號量熱更新的實現(xiàn)示例
  • golang模擬實現(xiàn)帶超時的信號量示例代碼
  • golang 監(jiān)聽服務(wù)的信號,實現(xiàn)平滑啟動,linux信號說明詳解

標(biāo)簽:滄州 泰安 阿壩 駐馬店 瀘州 昭通 東營 晉中

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出詳解》,本文關(guān)鍵詞  Golang,信號處理,及,如何,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产一区免费在线观看| 天天色成人| 国产一区二区精品久久| 成人在免费观看视频国产| 午夜在线亚洲男人午在线| 91麻豆国产福利精品| 九九热精品免费观看| 国产a网| 欧美国产日韩久久久| 日本在线不卡视频| 欧美另类videosbestsex久久| 日韩专区第一页| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产高清在线精品一区a| 美女免费毛片| 九九精品影院| 黄色免费三级| 欧美国产日韩久久久| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品毛片视频| 国产成人欧美一区二区三区的| 欧美激情影院| 日本伦理网站| 欧美1区| 国产美女在线观看| 精品国产亚一区二区三区| 一级毛片视频免费| 国产伦精品一区三区视频| 日本伦理网站| 色综合久久天天综合绕观看| 久久精品免视看国产成人2021| 成人a大片在线观看| 国产国语在线播放视频| 高清一级片| 亚飞与亚基在线观看| 欧美激情一区二区三区视频 | 欧美一区二区三区性| 国产一区二区精品在线观看| 国产高清在线精品一区a| 国产高清视频免费观看| 午夜在线观看视频免费 成人| 九九精品影院| 香蕉视频三级| 四虎影视久久久| 日韩女人做爰大片| 青青青草影院 | 97视频免费在线观看| 久草免费在线视频| 久久精品成人一区二区三区| 91麻豆国产福利精品| 欧美国产日韩在线| 青草国产在线| 999久久久免费精品国产牛牛| 久久成人亚洲| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产a免费观看| 国产视频一区二区三区四区| 国产成人精品一区二区视频| 美女免费毛片| 国产一区免费在线观看| 久久精品成人一区二区三区| 欧美激情一区二区三区视频高清| 九九九国产| 精品视频在线观看一区二区三区| 青草国产在线| 日本特黄特色aa大片免费| 亚州视频一区二区| 成人免费网站久久久| 精品视频在线看 | 999久久66久6只有精品| 日韩专区一区| 999久久久免费精品国产牛牛| 久久国产精品只做精品| 亚洲 欧美 成人日韩| 亚欧乱色一区二区三区| 欧美18性精品| 精品国产香蕉在线播出 | 久草免费在线视频| 国产不卡在线看| 日本特黄特色aa大片免费| 精品在线观看一区| 欧美电影免费| 亚飞与亚基在线观看| 999精品影视在线观看| 欧美激情影院| 日韩av成人| 日本特黄特色aa大片免费| 午夜在线亚洲男人午在线| 一本伊大人香蕉高清在线观看| 国产高清在线精品一区二区| 欧美1区| 日韩免费在线视频| 日本在线不卡视频| 黄视频网站免费| 日韩一级黄色大片| 天天色成人| 国产一区二区高清视频| 日韩在线观看免费完整版视频| 亚欧乱色一区二区三区| 久久99中文字幕| 国产精品免费久久| 99热视热频这里只有精品| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美激情一区二区三区视频高清| 精品久久久久久中文| 日本伦理黄色大片在线观看网站| 国产国语在线播放视频| 欧美一区二区三区性| 九九久久国产精品| 韩国毛片免费大片| 国产高清在线精品一区二区| 国产视频在线免费观看| 二级片在线观看| 尤物视频网站在线观看| 国产a免费观看| 九九热精品免费观看| 国产成人精品综合在线| 黄视频网站免费| 国产激情视频在线观看| 深夜做爰性大片中文| 成人影视在线播放| 韩国毛片 免费| 99色视频在线| 99久久精品费精品国产一区二区| 久久99爰这里有精品国产| 99色视频在线| 亚洲精品中文一区不卡 | 久久精品免视看国产成人2021| 亚飞与亚基在线观看| 欧美激情中文字幕一区二区| 可以免费看毛片的网站| 国产精品12| 成人在免费观看视频国产| 欧美激情一区二区三区视频高清| 国产成人精品综合| 深夜做爰性大片中文| 你懂的福利视频| 天堂网中文在线| 精品国产一区二区三区精东影业| 亚洲第一视频在线播放| 欧美一级视| 国产麻豆精品视频| 国产麻豆精品视频| 精品久久久久久中文| a级毛片免费全部播放| 四虎影视久久久| 亚洲精品中文一区不卡 | 成人a大片在线观看| 成人免费观看的视频黄页| 日韩中文字幕在线观看视频| 国产91精品一区| 美女免费毛片| 人人干人人草| 青草国产在线| 四虎影视库| 九九免费高清在线观看视频| 国产精品12| 久久精品店| 麻豆午夜视频| 国产伦精品一区二区三区在线观看| 韩国毛片 免费| 国产国产人免费视频成69堂| 日韩中文字幕在线观看视频| 99色视频在线| 国产国产人免费视频成69堂| 精品视频一区二区三区免费| 日本在线不卡视频| 日本免费乱人伦在线观看 | 国产高清在线精品一区二区| 成人免费观看的视频黄页| 国产一区免费在线观看| 一级片片| 青青久久精品国产免费看| 国产视频久久久久| 日本免费看视频| 精品在线视频播放| 成人a大片在线观看| 日韩免费在线视频| 在线观看成人网| 欧美激情一区二区三区视频高清| 中文字幕一区二区三区 精品| 中文字幕一区二区三区 精品| 在线观看成人网| 九九久久国产精品| 国产美女在线观看| 欧美国产日韩在线| 日本免费乱人伦在线观看 | 亚欧成人乱码一区二区| 99久久精品费精品国产一区二区| 国产一区二区精品在线观看| 国产a免费观看| 日本伦理黄色大片在线观看网站| 欧美激情影院| 麻豆网站在线看| 精品视频在线观看一区二区三区| 久久精品免视看国产成人2021| 四虎影视久久久| 国产一级生活片| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 你懂的在线观看视频|