題 是否可以將前台進程放入後台而不掛起(control + z)?


我正在運行一個接收TCP和UDP數據包的應用程序,因此無法暫停。我在背景模式下使用了最初的3個具有不同參數的應用程序 &。我什麼時候做的 $fg,這三個過程都進入了前台。現在我想再將它們發送到後台但沒有暫停。我怎樣才能做到這一點?


9
2018-05-15 07:12


起源


這是一個ServerFault主題,關於將正在運行的進程移動到新的屏幕實例 - > serverfault.com/questions/55880/... - Alan Barber


答案:


首先要做的事情是:只有  在前台進程,而不是全部三個。 fg 將最新的流程帶入前台。製作過程 按Ctrl+ž然後輸入 bg 更快地“干擾”有問題的應用程序(請注意,進程調度程序無論如何都會每秒多次執行此操作),找出前台進程的PID,然後在第二個終端/ SSH會話中使用

kill -SIGSTOP »pid« ; kill -SIGCONT »pid«

你原來的終端會說 stopped,但既然你發了一個 SIGCONT 馬上,這個過程將繼續在後台運行。


10
2018-05-15 07:47



@stefen:你的解決方案很有說服力。它不會以任何方式傷害我的進程,假設如果我們掛起進程,那麼建立的套接字連接不會中斷(調度程序切換不會斷開套接字連接,確保這一點)。將調試此更新。非常感謝。如果 - rahul.deshmukhpatil


如果你真的有一個前台工作,那麼bash正在等待它完成,那或多或少是 前台作業的定義。 如果bash仍然控制終端,請檢查發生了什麼 jobs -l,例如:

$ ncat -kl -p 10111 &
[1] 13404
$ ncat -kl -p 10222 &
[2] 13405
$ ncat -kl -p 10333 &
[3] 13406
$ jobs -l
[1]  13404 Running                 ncat -kl -p 10111 &
[2]- 13405 Running                 ncat -kl -p 10222 &
[3]+ 13406 Running                 ncat -kl -p 10333 &

我開始三個背景 ncat 聽取這個過程。您可能還會看到作業狀態的“完成”或“已停止”。

您可以使用來自不同shell的後台作業 斯蒂芬賽德爾的SIGSTOP / SIGCONT方法(儘管如此) 發送實際信號 用一個shell 按Ctrl - ž 是SIGTSTP,信號應該工作)。

兩者之間有一個微妙的區別 流程 和 工作 當使用術語前景和背景時。只有一個殼 前台工作,可以有多個 前台進程 (這與...有關 終端進程組ID,並且當您在管道中啟動兩個或更多進程時可以觀察到)。

當您使用時,在shell的控制下運行的進程或管道被稱為“作業” bg 要么 fg 命令你 隱式 提到最近的工作 - 在我的情況下是一個與 + 在上面。這些工作也可以(除其他外)參考 明確地 %1%2或%3(數字為1) [])。

不合格 fg 命令只會影響最近的一個作業,所以你可能會誤解你對當前情況的理解。 後台工作 可以 還是寫到終端:

  echo foo > /dev/tcp/127.0.0.1/10111

它可以取決於程序如何處理終端, ncat 寫得很好。雖然程序將停止執行,但您會看到“已停止”消息。 shell將啟動進程並等待它們退出或接收SIGTTIN信號(nohup是一種解決這個問題的方法 disown)。

你可以背景一個 具體 停止了工作

$ bg %3

(在我的情況下,我會得到錯誤 bash: bg: job 3 already in background

否則,如果一個進程在前台,除非程序捕獲SIGTSTP並做一些特殊的事情,否則它不太可能出現問題 按Ctrl - ž 和 bg。在這方面,網絡程序並沒有什麼特別之處,內核將緩衝傳入的連接/數據(直到某一點)。然而,流連接可能具有可觀察到的暫停。

見“工作控制“bash手冊頁的部分了解更多詳情。


2
2018-05-15 11:35





最簡單的方法是使用 屏幕 程序。您可以在虛擬終端中啟動應用程序,然後使用Ctrl + A,D退出屏幕。如果您想恢復會話,請輸入您的類型 screen -x。如果您有多個進程,將向您顯示要重新附加的屏幕列表。有關詳細信息,請閱讀 屏幕手冊頁


1
2018-05-15 07:30



我認為他正在尋找“事後”的解決方案,即流程現在正在運行。 - Stefan Seidel