任何進(jìn)程退出時(shí),都會(huì)留下退出碼,操作系統(tǒng)根據(jù)退出碼可以知道進(jìn)程是否正常運(yùn)行。
退出碼是0到255的整數(shù),通常0表示正常退出,其他數(shù)字表示不同的錯(cuò)誤。
package main
func main() {
panic("Call panic()")
}
root@fa13d0439d7a:/go/src# go run exit_code.go
panic: Call panic()
goroutine 16 [running]:
runtime.panic(0x425900, 0xc208000010)
/usr/src/go/src/pkg/runtime/panic.c:279 +0xf5
main.main()
/go/src/exit_code.go:4 +0x61
goroutine 17 [runnable]:
runtime.MHeap_Scavenger()
/usr/src/go/src/pkg/runtime/mheap.c:507
runtime.goexit()
/usr/src/go/src/pkg/runtime/proc.c:1445
goroutine 18 [runnable]:
bgsweep()
/usr/src/go/src/pkg/runtime/mgc0.c:1976
runtime.goexit()
/usr/src/go/src/pkg/runtime/proc.c:1445
exit status 2
我們可以看到最后一行輸出了exit status 2,證明進(jìn)程的退出碼是2,也就是異常退出。相比之下,運(yùn)行Hello World程序并沒有輸出退出碼,也就是進(jìn)程正常結(jié)束了。
不管是正常退出還是異常退出,進(jìn)程都結(jié)束了這個(gè)退出碼有意義嗎?
當(dāng)然有意義,我們?cè)趯態(tài)ash腳本時(shí),可以根據(jù)前一個(gè)命令的退出碼選擇是否執(zhí)行下一個(gè)命令。例如安裝Run程序的命令wget https://github.com/runscripts/run-release/blob/master/0.3.6/linux_amd64/run && sudo run --init,只有下載腳本成功才會(huì)執(zhí)行后面的安裝命令。
Travis CI是為開源項(xiàng)目提供持續(xù)集成的網(wǎng)站,因?yàn)闇y試腳本是由開發(fā)者寫的,Travis只能通過測試腳本的返回值來判斷這次測試是否正常通過。
Docker使用Dockerfile來構(gòu)建鏡像,這是類似Bash的領(lǐng)域定義語言(DSL),每一行執(zhí)行一個(gè)命令,如果命令的進(jìn)程退出碼不為0,構(gòu)建鏡像的流程就會(huì)中止,證明Dockerfile有異常,方便用戶排查問題。
了解進(jìn)程退出碼后,我們?nèi)タ锤嗟倪M(jìn)程資源。