---
# System prepended metadata

title: Process and Signal
tags: [Unix-like]

---

---
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)