Skip to main content

Command Palette

Search for a command to run...

Shell: wait, kill, trap 組合筆記

Updated
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

More from this blog

簡介 C++ 的 Type Erase (用多型和模板做 Duck Type)

起點 讓我們先從 template 出發:foo 需要一個 callback function。 template<typename Func> void foo(Func callback) { // ... callback(); } 但是這會讓編譯錯誤訊息有點模糊:假如 callback 並不是一個可以呼叫的函數指標,或者並不是一個 callable object ,那編譯器會說錯出在第四行。但是我們都希望,編譯器在呼叫函數時就幫我們指出:這不是 foo 想要的 call...

May 14, 20243 min read

帕秋莉的魔法筆記

45 posts

後端工程師。

不定時張貼一些寫扣時的筆記。