我正在使用SSH在远程服务器上启动后台进程 . 这就是我现在所拥有的:
ssh remote_user@server.com“nohup process&”
这是有效的,因为这个过程确实开始了 . 但是在我点击Ctr-C之前,SSH会话本身并没有结束 .
当我点击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:
nohup
ssh user@server 'DISPLAY=:0 nohup xeyes < /dev/null > std.out 2> std.err &'
这样,您将完全脱离远程进程 . 小心使用 ssh -f user@host... ,因为这只会将ssh进程放在主叫方的后台 . 您可以通过在呼叫计算机上运行 ps -aux | grep ssh 来验证这一点,这将显示ssh呼叫仍处于活动状态,但只是放在后台 .
ssh -f user@host...
ps -aux | grep ssh
在上面的例子中,我使用了 DISPLAY=:0 ,因为xeyes是一个X11程序,我希望它在远程机器上启动 .
DISPLAY=:0
您可以使用 screen 在此屏幕上运行您的进程,从屏幕 Ctrl-a :detach 分离并退出当前会话而不会出现问题 . 然后,您可以重新连接到SSH并再次连接到此屏幕以继续执行任务或检查是否已完成 .
screen
Ctrl-a :detach
或者您可以将命令发送到已经运行的屏幕 . 您的本地脚本应如下所示:
ssh remote_user@server.com screen -dmS new_screen sh screen -S new_screen -p 0 -X stuff $'nohup process \n' exit
欲了解更多信息,请参阅tutorial
3 回答
ssh的“-f”选项告诉ssh在后台运行远程命令并立即返回 . 例如 . ,
如果您键入以上内容,您将立即返回shell提示符,然后您将看到“foo”输出 . 五秒钟后,您将看到“bar”输出 . 在此期间,您可能一直在使用shell .
使用
nohup
时,请确保您还重定向stdin,stdout和stderr:这样,您将完全脱离远程进程 . 小心使用
ssh -f user@host...
,因为这只会将ssh进程放在主叫方的后台 . 您可以通过在呼叫计算机上运行ps -aux | grep ssh
来验证这一点,这将显示ssh呼叫仍处于活动状态,但只是放在后台 .在上面的例子中,我使用了
DISPLAY=:0
,因为xeyes是一个X11程序,我希望它在远程机器上启动 .您可以使用
screen
在此屏幕上运行您的进程,从屏幕Ctrl-a :detach
分离并退出当前会话而不会出现问题 . 然后,您可以重新连接到SSH并再次连接到此屏幕以继续执行任务或检查是否已完成 .或者您可以将命令发送到已经运行的屏幕 . 您的本地脚本应如下所示:
欲了解更多信息,请参阅tutorial