# Shell: wait, kill, trap 組合筆記

## **Story**

有一個 python 的 single process script ，要模擬 multiprocess 情境，但又希望只用 shell script 觸發：

1. 同時跑起好幾個 process
    
2. 使用者輸入 Ctrl-C 就中斷所有 process
    
3. 要等到所有 process 都關掉才會結束 shell script
    

```python
import time
def main():
    while True:
        time.sleep(1)
        print("Hello, world!")
if __name__ == "__main__":
    main()
```

那我們就需要使用 `wait`、`trap`、`kill` 等命令。

`wait` 命令用於等待一個或多個子進程結束。

`trap` 命令用於設定訊號陷阱。當指定的訊號發生時，將執行指定的命令。

`kill` 命令用於向一個或多個進程傳送訊號。

## **Need**

### 取得前一指令的 pid

```bash
proc_id=$!
```

### 監控 sigint

`trap` 命令用於設定訊號陷阱。當指定的訊號發生時，將執行指定的命令。其語法如下：

```bash
trap command [signal ...]
```

其中，`command` 是要執行的命令。`signal` 是要設定陷阱的訊號。如果省略 `signal`，則將設定所有訊號的陷阱。

```bash
trap_ctrlc() {
   # handle ctrl-c
}

trap trap_ctrlc INT
```

### 砍掉並且等待

`kill` 命令用於向一個或多個進程傳送訊號。其語法如下：

```bash
kill [signal] pid
```

`wait` 命令用於等待一個或多個子進程結束。其語法如下：

```bash
wait [pid ...]
```

其中，`pid` 是要等待的子進程的 PID。如果省略 `pid`，則將等待所有子進程結束。

```bash
kill $proc_id wait $proc_id
```

## **Code**

```bash
#!/bin/bash
python3 main.py &
proc1_id=$!
python3 main.py &
proc2_id=$!

trap_ctrlc() {
    kill $proc1_id
    kill $proc2_id
    wait $proc1_id
    wait $proc2_id
}

trap trap_ctrlc INT
wait
```
