Shell: wait, kill, trap 組合筆記

·

1 min read

Story

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

  1. 同時跑起好幾個 process

  2. 使用者輸入 Ctrl-C 就中斷所有 process

  3. 要等到所有 process 都關掉才會結束 shell script

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

那我們就需要使用 waittrapkill 等命令。

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

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

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

Need

取得前一指令的 pid

proc_id=$!

監控 sigint

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

trap command [signal ...]

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

trap_ctrlc() {
   # handle ctrl-c
}

trap trap_ctrlc INT

砍掉並且等待

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

kill [signal] pid

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

wait [pid ...]

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

kill $proc_id wait $proc_id

Code

#!/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