Shell: wait, kill, trap 組合筆記
Story
有一個 python 的 single process script ,要模擬 multiprocess 情境,但又希望只用 shell script 觸發:
同時跑起好幾個 process
使用者輸入 Ctrl-C 就中斷所有 process
要等到所有 process 都關掉才會結束 shell script
import time
def main():
while True:
time.sleep(1)
print("Hello, world!")
if __name__ == "__main__":
main()
那我們就需要使用 wait
、trap
、kill
等命令。
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