我需要远程运行 SSH 命令,并在本地显示输出。但如果连接中断,我希望命令仍能运行。
我并不是在谈论登录和执行,而是执行 ssh user@remotehost 'commands && command etc'
如何确保即使连接中断命令仍能运行?
答案1
最好的方法是使用屏幕,即使连接中断,它也会以持久的方式保持会话打开(如果您想再次开始使用它,您可以执行 ascreen -r
并且它会再次打开它)。
在您想要运行的任何命令前面加上前缀screen
(例如ssh -t user@host screen command
)都应该可以完成这项工作。
如果您希望它在 shell 的后台运行,您也可以将一个附加&
到整个内容。
答案2
您是否希望拥有一个可以恢复的持久会话,或者只是为了阻止断开连接并终止执行?
对于前者,使用screen
,对于后者,使用nohup
。
答案3
如前所述,screen
它可以完成所有任务。但不仅仅是你需要的。多年来我一直使用屏幕,现在每次登录系统时都会使用它。尝试使用以下配置进行安装screen
和创建:~/.screenrc
sessionname vcflists
startup_message off
deflogin off
vbell off
msgminwait 0
msgwait 10
log off
backtick 1 0 0 hostname
caption splitonly "%?%F%{= yk}%:%{= Kk}%? %n %t%="
hardstatus alwayslastline "%{= rY} %1` %{= kg} %0c %{= bY} %-w%{= Yk} %n %t %{-}%+w %=%{g}%l "
然后运行screen -Rd vcf
。这是对 screen 的首选调用。您将重新连接到之前创建的名为 vcf* 的会话(如果有歧义则会发出警告),或者,如果会话尚未打开,则会创建该会话。CTRL+A是一个可以做所有事情的元键。CTRL+A C
(CTRL+ A,然后C)在会话内创建新窗口(screen)。CTRL+A SPACE
将焦点移到下一轮窗口。CTRL+A D
分离当前会话,使所有窗口在连接之间保持正常功能。如果您启动了一些很长的任务,您可以与 screen 分离,稍后再重新连接,看看会发生什么。如果您的 ssh 会话丢失,也会发生同样的情况 - screen 保持活动状态,所有打开的窗口和所有启动的任务都会启动。
如果您想关闭屏幕内的某个窗口 - 只需exit
从其中的 shell 中关闭即可。如果您想关闭所有窗口中的所有 shell/任务并退出屏幕 - 只需按CTRL+A CTRL+\
并在询问时按“Y”。
其余内容请参见手册屏幕。
答案4
我通常会这样做:
nohup mycommand &
tail -f nohup.out