[英]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.