在 bash 中,當且僅當…?
以下是互動式 shell 中的程序組不是 shell 工作的兩種情況:
$ sleep 100 & [1] 16081 $ jobs [1]+ Running sleep 100 & $ disown %1 $ jobs $
和
$ ( sleep 200 & ) $ jobs $
每個案例如何實現使流程組不是工作?在互動式 bash 中,一個程序組成為 shell 的工作的充分必要條件是什麼?
shell 是在偽終端從屬設備上執行的會話領導者。當 shell 終止時,它不會影響上面的兩個睡眠程序,因為它們不在 shell 的作業列表中,所以不會收到 SIGHUP。然後
- 兩個睡眠程序是否仍然將偽終端從機作為其會話的控制終端?
kill
除了正常退出或通過發送信號被殺死之外,還有什麼可以終止這兩個睡眠程序?我想知道這兩種情況與真正的守護程序有多大不同。
在這兩種情況下,程序組都是作為 shell 的工作開始的。當您呼叫
disown %1
時,shell 會從其作業列表中刪除該條目:這就是disown
. 使用( sleep 200 & )
,該sleep
過程是由括號創建的子shell 的工作;你可以通過執行看到( sleep 200 & jobs )
。當 shell 退出時,這個就不再是 shell 的工作了。與其他一切一樣,子shell 的工作是它自己的,父級永遠不會看到它們。這些程序保持在同一個會話中,並且仍然具有相同的控制終端。這與工作控制無關。
與任何程序一樣,它們可以通過退出或接收信號來終止。由於它們不是前台程序組的成員(並且不能是,因為 shell 不會將它們放回前台),因此如果終端消失,它們將不會收到核心生成的 SIGHUP。
一個程序組是一個 shell 的工作,如果它開始是一個 shell 的工作並且它沒有停止成為一個工作。哪些命令成為單獨的作業的詳細資訊取決於外殼程序,超出了此答案的範圍。簡而言之,如果 shell 啟用了作業控制(如果 shell 是互動式的,這是預設設置),那麼每個複合命令都是它自己的作業。尤其:
- 管道是一個單一的工作。
- 命令或程序替換不是單獨的作業,它在原始程序組中執行。
- 在後台執行的任何內容(以 Ctrl+Z 開始
&
或以 Ctrl+Z 為背景)都是一項單獨的工作。如果程序組的領導者退出、shell 退出或 shell 允許它離開(帶有
disown
),則程序組將不再是作業。