如何從另一個 shell 中取消程序
為避免退出 shell 時程序停止,您可以通過
nohup
或啟動命令screen
。也可以使用以下命令取消現有程序:mycommand # Press CTRL-Z bg disown %1
但這只能從目前 shell 啟動。
我想使用另一個 shell/ssh 會話來做同樣的事情(命令在shell A上啟動,但在****shell B上啟動 disown )。
可以將程序從另一個 shell 置於後台:
# CTRL-Z can be done via kill -20 PID (SIGSTP) # bg can be done via kill -18 PID (SIGCONT)
但該程序仍歸初始外殼所有。我如何從另一個 shell 中拒絕該過程?
我正在使用 Linux 4.15
這是不可能的。
好吧,如果您準備好使用調試器,並戳穿執行您的 shell 程序的程序的內部結構。更具體地說:這在 shell 程式級別上以簡單直接的方式是不可能的。
這是因為
disown
影響了 shell 程序在每個單獨的 shell 程序的記憶體空間中維護的“作業”列表。Shell(即作業控制)記住它們在其內部“作業表”中派生的子程序,直到它們被指示忘記它們
disown
或子程序終止並且 shell 已wait()
為它們編輯並報告終止工作”。disown
不會以任何方式影響子程序狀態。它會影響 shell 的功能。因為它忘記了
disown
ed 過程……
wait()
……當通知它終止孩子時,它不再承認“工作”的完成;exit
……當它被告知/時,它不再關心程序是否仍在執行logout
;和- ……當它自己收到一個掛斷信號時(或者,在某些 shell 程序的情況下,當它退出並且它知道它是一個互動式登錄 shell)時,它不再向孩子發送一個掛斷信號。
Shell 不共享這些列表,並且它們不容易從其他程序訪問(如前所述,沒有啟動調試器並附加它)。
disown
除了在相關 shell 程序本身中執行的內置命令外,沒有 IPC 機製或命令行工具可以訪問它們。(這就是為什麼它是一個內置命令。)這就是為什麼
disown
即使在同一個登錄會話中你也不能從第二個 shell 工作。disown
完全是 per-shell per-shell-process 的事情。此外 …
可以將程序從另一個 shell 置於後台。
事實上,這不是你一直在做的。
前景和背景的概念與會話的控制終端有關。具體來說,控制終端知道一個程序組,即前台程序組。停止和繼續程序本身不會在前台和後台之間切換程序。還需要更新控制終端的前台程序組。前台程序僅通過成為該前台程序組的成員才處於前台。該會話中的所有其他程序組以及這些程序組中的程序都在後台。
具有諷刺意味的是,您並沒有從另一個 shell 執行此操作。你一直在做的是觸發原始的 shell 程序採取行動。它看到前台程序組的主程序停止,並調整終端的前台程序組(回到自己的程序組)作為響應。
順便說一句,正確的信號是
SIGTSTP
。進一步閱讀