題 Linux進程到後台 - 重新登錄 - 如何將進程帶回前台?


我啟動一個進程,將它放在後台運行,然後註銷,然後再次登錄,並希望再次將進程置於最前面。我已經查看了PID的“ps aux”,但它不會被放入“fg ###”的前台。什麼是正確的方法?

(我在兩個登錄會話中使用相同的帳戶。)


4
2018-02-09 05:00


起源




答案:


實現這一目標的最常見方法可能是 GNU屏幕

Screen是一個全屏窗口管理器   多路復用物理終端   通常在幾個過程之間   互動殼。

基本上你會:

  • 確保 screen 已安裝。通常這是包''screen'在大多數Linux發行版上。它默認安裝在Mac OS X上。
  • 執行 screen

alt text

alt text

  • 運行您想要'背景'的程序。例如,我開始拖尾日誌文件:

alt text

  • Ctl-a, d 分離屏幕。

  • 退出,做其他事情,無論你喜歡什麼。在這裡,我將向日誌發送消息。

alt text

  • 再次登錄時,鍵入 screen -r 重新連接之前運行的會話。在這裡,您可以看到我發送到日誌的消息(以及之前的測試)。

alt text

屏幕被許多人認為是Linux / Unix上的高級用戶工具,我傾向於同意!

有關屏幕的更多信息,請參閱其主頁或此深入文章 Ars Technica


10
2018-02-09 05:43





AFAIK沒有直接的方法來啟動在另一個shell中啟動和後台化的進程。但是,有幾種方法可以解決這個問題。

最好的方法是使用 GNU屏幕。啟動屏幕會話,啟動進程,從屏幕會話中分離,註銷,重新登錄,重新連接到屏幕會話。該過程仍在運行,屏幕將任何輸出保留在窗口緩衝區中。你甚至不需要背景;您可以讓它在一個屏幕窗口中運行,並將其他窗口用於其他任務。

醜陋的hackish方式是在退出之前將它從終端分離。在bash, disown -h %[jobid] 做這個;當你退出shell時,像tcsh這樣的其他shell會自動為後台進程執行此操作。 (得到 $[jobid] 通過運行命令 jobs。)您無法直接重新連接到該過程,但如果您只需要一個進程的stdout / stderr / stdin,那麼 能夠 使用GDB偽造重新連接。這是一個部分的方法 從這個來源 (最初包含在 另一個答案):

[...]有些骯髒的黑客,事實並非如此   不可能重新打開一個過程'   標準輸出/ STDERR /標準輸入。

所以你仍然可以創建一個空白   屏幕窗口(例如運行   睡覺)。

然後使用gdb來實例化   附加到過程,做一些   叫關閉(0)
  致電(1)
  電話關閉(2)
  調用open(“/ dev / pts / xx”,...)
  呼叫dup(0)
  呼叫dup(0)
  分離

該過程的輸出將轉到   屏幕。它不會附加   那個屏幕終端,例如[sic]   會殺死“睡眠”命令,而不是   這個過程,但這可能就足夠了   對於OP。

一些製作bash的方法可以自動顯示,但他們涉及 shopts 要么 nohup的 或其他bash技巧,以避免自動SIGHUP。 bash在這方面不如tcsh優雅,你必須提前知道你需要這個來設置選項。跑起來要容易一點  在退出之前的背景工作。


4
2018-02-09 05:50