Shell
如何將一個程序從一個程序組移動到另一個程序組,以及如何列出每個程序組中的程序?
根據我目前了解到的情況,一個終端只有一個會話,一個會話有一個或多個程序組,一個程序組有一個或多個程序。
下圖說明了這一點:
我有兩個問題:
- 如何將一個程序從一個程序組移動到另一個程序組?
- 如何列出每個程序組中的程序?
**編輯:**我的意思是如何從終端而不是以程式方式做這兩件事。
從使用者甚至典型程序員的角度來看,您不會將流程從一個組移動到另一個組。組織程序組是 shell 的工作。當您以互動方式執行作業時,shell 會將其放入自己的組中。
Ctrl
這樣做的主要目的是在使用者按下+時殺死整個組(例如管道中的所有程序)C
。更一般地說,程序組使之成為可能的一件事是原子地殺死一組程序。如果您嘗試列出一些程序然後殺死它們,其中一個可能在兩者之間產生了分叉。當您殺死一個程序組時,即使它們正忙於分叉,也會殺死該組中的所有程序。
作為使用者或應用程序程序員,您有時可能想做的一件事是在自己的組中執行一個新程序。沒有使用者級命令可以做到這一點。您可以通過啟動互動式 shell 來實現。(有關複雜範例,請參閱在 shell 腳本中超時。)還有其他命令,例如GNU coreutils 和 Linux 中的
timeout
實用程序以及 util-linux 套件中的setsid
實用程序,它們可以創建一個新的程序組作為其操作的一部分。將程序移動到不同程序組的系統呼叫是
setpgid
. (還有一個部分別名叫做setpgrp
。)有限制:它只能由程序本身或其父程序呼叫,並且目標組必須與原始組在同一會話中。您不能隨意將程序從一組移動到另一組。沒有具體的方法來列舉組中的程序。您所能做的就是列舉所有程序並選擇該特定組中的程序。您可以通過包含列(例如)在
ps
輸出中列出程序組。pgid``ps -e -o pid,ppid,pgid,args