2012-02-11 114 views
16

我試圖通過ssh啓動一個測試服務器,但是一旦我從ssh斷開,它總是死掉。通過ssh運行持久化進程

有沒有辦法啓動一個進程(運行服務器),所以它不會死在我的SSH會話結束?

回答

17

作爲nohup的替代方案,您可以在終端複用器內部運行遠程應用程序,如GNU screentmux

使用這些工具可以輕鬆地重新連接到其他主機的會話,這意味着您可以在離開工作之前進行長時間的構建或下載,並在您回家時檢查其狀態。例如。我發現這對於在非常遠距離(不同國家)的服務器進行開發工作時非常有用,它與我和他們之間的不可靠連接,如果連接斷開,我可以簡單地重新連接並繼續運行而不會丟失任何狀態。

+1

示例:使用ssh和屏幕創建持久的終端會話可以從任何地方訪問http://bit.ly/1ewxKKv – Jon 2014-04-11 16:54:12

4

是;您可以使用the nohup command來吞下當掛斷SSH會話時發送到程序的HUP(「掛斷」)信號。或者,如果您自己編寫服務器,則可以將其編碼爲register a handler作爲HUP信號,並將其吞入程序中(而不是使用外部nohup程序執行相同操作)。

3

作爲nohup,screen等的替代方案,您可以修改您的服務器以調用daemon將其從終端上分離。這是爲linux編寫服務的慣用方法。請參閱daemon(3)

4

除了對方回覆,你可以開始測試服務器通batch(或at),但作爲Brian answered你應該叫daemon

而且你可以在-f選項傳遞給ssh

+3

謝謝。你把'-f'選項的一天保存到了ssh。 – 2015-02-02 14:12:45

3

如果」重新連接到systemd的Linux發行版,您可以使用systemd-run在後臺啓動進程(systemd的術語「瞬時服務」)。例如,假設你要ping的東西在後臺:

systemd-run --unit=pinger ping 10.8.178.3 

你會systemd在剛剛運行的進程與nohup得到的好處是,systemd將跟蹤過程和它的孩子,保留日誌,記退出代碼,並允許你乾淨地殺死進程和所有它的孩子。實例:

見的狀態和輸出的最後行:

systemctl status pinger 

流輸出:

journalctl -xfu pinger 

殺:

systemctl kill pinger