2012-08-04 21 views
5

當我在終端的後臺啓動一個進程,以及如果終端被關閉,我們就無法再與這個進程交互了。我不確定,但我認爲程序也會被殺死。請問任何人都可以告訴我如何從終端上分離該流程。所以即使關閉終端,我也可以在新的終端上使用同一個進程進行交互?如何在unix中從終端中分離進程?

我是unix新手,所以你的額外信息將幫助我。

+2

你爲什麼不先試試自己?在後臺啓動一個進程,註銷並重新進入,並用'ps'檢查進程是否還在# – patrix 2012-08-04 10:08:45

+0

下面是一個有趣且有用的問題。我懷疑當終端遇害時,通過終端啓動的進程將被殺死。老實說,這聽起來像是一個叉子,但我不知道,我從來沒有需要調用叉子。 – Dale 2012-08-04 10:11:45

+0

如果您註銷或以其他方式丟失會話,則會終止該進程,除非您使用[nohup](http://en.wikipedia.org/wiki/Nohup)命令:)但不確定是否可以重新獲取該進程新會話 – 2012-08-04 10:14:40

回答

5

您也可以考慮screen命令。它具有「恢復我的會話」功能。誠然,我從來沒有使用過它,並忘記了它。

作爲守護進程啓動進程,或者使用nohup可能無法做到您想要的所有功能,包括重新捕獲stdout/stdin。

網絡上有很多例子。在谷歌嘗試, 「UNIX命令屏幕」 和 「UNIX屏幕教程」:

3

首先谷歌結果爲「UNIX妖魔化的過程」:

參見守護進程(3)聯機幫助頁的簡短概述。守護進程 的主要目的是進入後臺,而不會退出或阻止任何事情發生。一個進程可以做的 事情列表來實現這一點:

  • 叉()
  • setsid()
  • 關閉/重定向標準輸入/輸出/標準錯誤到/ dev/null的,和/或忽略SIGHUP/SIGPIPE。
  • chdir()to /。

如果作爲根進程啓動,您還想首先執行根目錄 的操作,然後刪除權限。即,將有效用戶更改爲使用setuid()/ setgid()的「守護進程」 用戶或「nobody」。如果您不能刪除所有權限,並且有時需要root訪問權限,請在不需要時使用seteuid()臨時刪除它。

如果您要分支一個守護進程,那麼還要設置子句柄,如果調用exec,則 會在您的子進程不需要的所有文件描述符的exec標誌上設置關閉。

而這裏的創造Unix的守護進程一個HOWTO:http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html

+1

或多或少我想的。如果/當我需要編寫一個守護進程時,我確信我必須自己去google/stackoverflow所有這些廢話。 – Dale 2012-08-04 10:16:59

13

你要找的是不認的命令。

disown <processid> 

這是儘可能接近nohup。它將進程從當前登錄中分離出來,並允許它繼續運行。謝謝David Korn!

http://www2.research.att.com/~gsf/man/man1/disown.html

,我只是發現reptyr它可以讓你重新設置父級一個六親不認的過程。 https://github.com/nelhage/reptyr

它已經在ubuntu的軟件包中。

但是如果你還沒有開始這個過程,並且你打算在未來這樣做,那麼要走的路是screentmux。我更喜歡screen

0

'與'互動'可能意味着一些事情。

從命令行啓動的程序在終端結束時退出的原因是,shell在退出時將該進程發送一個HUP信號(有關介紹請參見kill(1)的文檔; HUP,by方式,是'掛斷'的簡稱,原來表示用戶掛斷了調制解調器/電話)。對HUP信號的默認響應是一個進程終止 - 也就是被調用的程序退出。

細節稍微雜亂一些,但這是一般的直覺。

nohup命令告訴shell啓動程序,並且以這種方式這樣做,即忽略此HUP信號。也就是說,在調用終端退出後程序繼續運行。

你可以用這個程序通過發送信號仍然互動(參閱kill(1)再次),但這是一種非常有限的互動,並取決於你的程序被寫入做明智的事情,當它接收到這些信號(信號USR1USR2是有用的東西來陷阱,如果你是這樣的事情)。或者,您可以通過命名管道,信號量或進程間通信(IPC)的其他位進行交互。這很快就會變得非常快。

我懷疑你在追求什麼,但是能夠重新連接一個終端到這個過程。這是一個相當複雜的過程,像screen這樣的應用程序在幕後做了適當複雜的事情來實現這一點。

nohup事情是一種快速和骯髒的守護進程。 daemon(3)函數正確執行守護進程,按照YePhIcK的回答所述進行各種整理,以全面地中斷與調用它的進程/終端的鏈接。您可以使用與上述相同的IPC工具與守護進程進行交互,但不能直接與終端進行交互。