
有沒有辦法控制給定bash
會話中的一組作業?
理想情況下,我想說的是:
$ prog1 &
$ GROUP=FOO prog2 &
$ GROUP=FOO prog3 &
$ GROUP=BAR prog4 &
然後讓例如kill %FOO
僅終止prog2
和prog3
。
答案1
有沒有辦法在給定的 bash 會話中控制一組作業?
就在這裡! - 使用陣列形成組,並使用捕獲每個進程 ID$!
並將其附加到數組中。
$!
是一個POSIX指定的特殊參數,它給出最近後台命令的十進制進程 ID。
以下是有關如何在 Bash 中附加到數組並在問題上下文中列舉它們的教程:
首先聲明數組:
$ GROUP_FOO=()
$ GROUP_BAR=()
不屬於群組的工作:
$ prog1 &
若要進入 FOO 群組的作業(+=
符號表示該值應附加到陣列中):
$ prog2 &
$ GROUP_FOO+=($!)
FOO 小組的另一份工作:
$ prog3 &
$ GROUP_FOO+=($!)
BAR 組的工作內容:
$ prog4 &
$ GROUP_BAR+=($!)
若要終止 FOO 群組進程:
$ for id in ${GROUP_FOO[@]}; do kill $id; done
腳本版本
如果我編寫這個腳本,我會稍微修改一下,以便進程 ID 僅在成功啟動時添加到數組中:
prog2 & sleep 0.1; kill -0 $! && GROUP_FOO+=($!)
這樣,您的陣列中不太可能出現未運行的進程 ID,因為它們立即因錯誤而退出。 0.1 秒的睡眠延遲(甚至可能是 0.01 秒)為進程提供了退出並顯示錯誤代碼的時間。