簡體   English   中英

使用 SSH 在遠程服務器上啟動后台進程,並退出會話

[英]Use SSH to start a background process on a remote server, and exit session

我正在使用 SSH 在遠程服務器上啟動后台進程。 這就是我目前所擁有的:

ssh remote_user@server.com "nohup 進程 &"

這是有效的,因為該過程確實開始了。 但是 SSH 會話本身直到我按下 Ctr-C 才結束。

當我按下 Ctr-C 時,遠程進程繼續在后台運行。

我想將 ssh 命令放在我可以在本地運行的腳本中,因此我希望 ssh 會話在遠程進程啟動后自動退出。

有沒有辦法做到這一點?

ssh 的“-f”選項告訴 ssh 在后台運行遠程命令並立即返回。 例如,

ssh -f user@host "echo foo; sleep 5; echo bar"

如果您鍵入上述內容,您將立即返回您的 shell 提示符,然后您將看到“foo”輸出。 五秒鍾后,您將看到“bar”輸出。 同時,您可能一直在使用 shell。

使用nohup ,請確保您還重定向 stdin、stdout 和 stderr:

ssh user@server 'DISPLAY=:0 nohup xeyes < /dev/null > std.out 2> std.err &'

通過這種方式,您將與遠程進程完全分離。 使用ssh -f user@host...要小心,因為這只會將 ssh 進程置於調用方的后台。 您可以通過運行ps -aux | grep ssh來驗證這ps -aux | grep ssh ps -aux | grep ssh在調用機器上,這將顯示 ssh 調用仍然處於活動狀態,但只是放在后台。

在我上面的例子中,我使用DISPLAY=:0因為 xeyes 是一個 X11 程序,我希望它在遠程機器上啟動。

您可以使用screen在此屏幕上運行您的進程,從屏幕上分離Ctrl-a :detach並毫無問題地退出當前會話。 然后您可以重新連接到 SSH 並再次附加到此屏幕以繼續您的任務或檢查是否已完成。

或者您可以將命令發送到已經運行的屏幕。 您的本地腳本應如下所示:

ssh remote_user@server.com
screen -dmS new_screen sh
screen -S new_screen -p 0 -X stuff $'nohup process \n'
exit    

有關更多信息,請參閱本教程

這個問題已經有將近 10 年的歷史了,但我最近不得不在遠程服務器上啟動一個很長的腳本(需要幾個小時才能完成),我找到了一種使用 crontab 的方法。

如果可以在遠程服務器上編輯用戶的 crontab,請使用 ssh 連接到服務器,編輯 crontab 並添加將在下一分鍾啟動腳本的條目。 假設現在是 15 點 03 分。 添加這一行:

4 15 * * * /path/to/your/script.sh

保存您的 crontab,等待腳本啟動。 然后再次編輯您的 crontab 以刪除此條目。

然后您可以安全地退出 ssh,甚至可以在腳本運行時關閉您的計算機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM