### 退出碼
任何進程退出時,都會留下退出碼,操作系統根據退出碼可以知道進程是否正常運行。
退出碼是0到255的整數,通常0表示正常退出,其他數字表示不同的錯誤。
### 示例程序
~~~
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`,證明進程的退出碼是2,也就是異常退出。相比之下,運行Hello World程序并沒有輸出退出碼,也就是進程正常結束了。
### 使用退出碼
不管是正常退出還是異常退出,進程都結束了這個退出碼有意義嗎?
當然有意義,我們在寫Bash腳本時,可以根據前一個命令的退出碼選擇是否執行下一個命令。例如安裝Run程序的命令`wget https://github.com/runscripts/run-release/blob/master/0.3.6/linux_amd64/run && sudo run --init`,只有下載腳本成功才會執行后面的安裝命令。
[Travis CI](https://travis-ci.org/)是為開源項目提供持續集成的網站,因為測試腳本是由開發者寫的,Travis只能通過測試腳本的返回值來判斷這次測試是否正常通過。
Docker使用Dockerfile來構建鏡像,這是類似Bash的領域定義語言(DSL),每一行執行一個命令,如果命令的進程退出碼不為0,構建鏡像的流程就會中止,證明Dockerfile有異常,方便用戶排查問題。
了解進程退出碼后,我們去看更多的進程資源。
- 前言
- 致謝
- 概述
- 使用代碼
- 使用Docker
- 進程基礎
- 進程是什么
- Hello World
- PID
- PPID
- 使用PID
- 進程名字
- 進程參數
- 輸入與輸出
- 并發與并行
- 進程越多越好
- 進程狀態
- 退出碼
- 進程資源
- 死鎖
- 活鎖
- POSIX
- Nohup
- 運行進程
- Go編程實例
- 衍生新進程
- 執行外部程序
- 復制進程
- 進程進階
- 文件鎖
- 孤兒進程
- 僵尸進程
- 守護進程
- 進程間通信
- 信號
- Linux系統調用
- 文件描述符
- Epoll
- 共享內存
- Copy On Write
- Cgroups
- Namespaces
- 項目實例Run
- 項目架構
- 代碼實現
- 注意事項
- 創建目錄權限
- 捕獲SIGKILL
- Sendfile系統調用
- 后記
- 參考書籍
- 項目學習
- 再次感謝