Shell

如何從另一個 shell 中取消程序

  • March 27, 2019

為避免退出 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 的功能。

因為它忘記了disowned 過程……

  • wait()……當通知它終止孩子時,它不再承認“工作”的完成;
  • exit……當它被告知/時,它不再關心程序是否仍在執行logout;和
  • ……當它自己收到一個掛斷信號時(或者,在某些 shell 程序的情況下,當它退出並且它知道它是一個互動式登錄 shell)時,它不再向孩子發送一個掛斷信號。

Shell 不共享這些列表,並且它們不容易從其他程序訪問(如前所述,沒有啟動調試器並附加它)。disown除了在相關 shell 程序本身中執行的內置命令外,沒有 IPC 機製或命令行工具可以訪問它們。(這就是為什麼它是一個內置命令。)

這就是為什麼disown即使在同一個登錄會話中你也不能從第二個 shell 工作。 disown完全是 per-shell per-shell-process 的事情。

此外 …

可以將程序從另一個 shell 置於後台。

事實上,這不是你一直在做的。

前景背景的概念與會話的控制終端有關。具體來說,控制終端知道一個程序組,即前台程序組。停止和繼續程序本身不會在前台和後台之間切換程序。還需要更新控制終端的前台程序前台程序僅通過成為該前台程序組的成員才處於前台。該會話中的所有其他程序組以及這些程序組中的程序都在後台。

具有諷刺意味的是,您並沒有從另一個 shell 執行此操作。你一直在做的是觸發原始的 shell 程序採取行動。它看到前台程序組的主程序停止,並調整終端的前台程序組(回到自己的程序組)作為響應。

順便說一句,正確的信號是SIGTSTP

進一步閱讀

引用自:https://unix.stackexchange.com/questions/459852