--- tags: Unix-like --- # Process and Signal ## Process OS 邏輯排程執行的基本單位,為了管理 process,OS 會將 process 分組管理,Session 和 PG 就是 process 群組的單位。 Session → Process Group → Process - 每個 session / PG 都會有一個 leader,通常是該群集中第一個 process,也都會有一個 id,由該群集中第一個 process 的 PID 決定 - 每個 session 可以配給一個 terminal,一個 session 中,terminal 會被 attach 到其中一個 process group,稱為 **foreground process group**,其他的對應稱為 **background process group** ## Signal 是 OS 控制程序執行的媒介,作業系統中 process 間通訊的一種有限制的方式。它是一種異步的通知機制,用來提醒 process 一個事件已經發生。當一個 signal 傳送給一個 process,作業系統中斷了行程正常的控制流程,此時,任何非原子操作都將被中斷。例如用戶要終止某一執行中的應用程式,OS 就要將用戶的這個意圖,利用訊號正確地傳遞到指定的應用程序。這類要求 process 結束的訊號稱為 termination signals。[glibc](https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html) 的文件列出了所有終止訊號。 ### `SIGTERM` - Termination - 不像是 `SIGKILL` 那麼硬性的終止,而是有禮貌的詢問程式能不能終止,而程式可以拒絕忽略他 - `kill` 預設就會用 `SIGTERM` ### `SIGINT` - Interrupt - User 輸入 INTR character(Ctrl + C)時產生 ### `SIGQUIT` - 和 `SIGINT` 相似,但是是 user 輸入 QUIT character(Ctrl + \) 時產生 - 類似 error signal ### `SIGKILL` - 殘暴之力,立馬砍掉程式,請小心服用 ### `SIGHUP` - Hang-up - 用來提示 user terminal 斷線 ## [trap](https://man7.org/linux/man-pages/man1/trap.1p.html) `trap` 用來定義遇到什麼 signal 會做什麼事情,以下面為例,就是當遇到 `QUIT` 、 `TERM` 、 `INT` 時會執行中間的 command,就會去傳 SIGQUIT 的方式 kill 掉 NGINX 與 PHP_FPM 的 process,最後 wait 到他真的結束。 ```shell $ trap 'kill -SIGQUIT $NGINX_PID; kill -SIGQUIT $PHP_FPM_PID; wait $NGINX_PID; wait $PHP_FPM_PID;' QUIT TERM INT ``` ## 參考文件 - [Linux 的 process 和 signal / petertc](https://medium.com/@petertc/session-process-group-and-signal-in-linux-7fbe85c0b0c5)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up