我知道您可以使用 ~^z 暂停 ssh 会话,但是否也有办法将其置于后台,以便它在您在本地 shell 中执行其他操作时继续工作?
答案1
如果您尝试远程运行某个进程,并且不关心保持 ssh 会话打开,则可能需要考虑使用screen
。它将允许您在“后台”运行进程,并且在您注销后它将继续运行。
首先,ssh
转到远程框,然后从那里使用screen
并启动您的进程,您可以根据screen
需要为您的会话命名。您不会真正注意到任何不同,但在该会话中启动您的进程。然后您可以screen
使用命令退出会话Ctrl-a d
。它看起来像这样:
user@remotebox:~$ screen -S foobarsession
user@remotebox:~$ startmyprocess
[detached from 4865.foobarsession]
user@remotebox:~$
然后,您可以退出 ssh 会话,并且该进程将继续运行。要screen
稍后重新连接到会话,请 ssh 返回远程框并使用screen -r
重新连接。您可以使用screen -ls
列出会话。
user@remotebox:~$ screen -ls
There is a screen on:
4865.foobarsession (10/05/2012 11:10:57 AM) (Detached)
1 Socket in /var/run/screen/S-user
user@remotebox:~$ screen -r foobarsession
user@remotebox:~$ screen -ls
4865.foobarsession (10/05/2012 11:10:57 AM) (Attached)
1 Socket in /var/run/screen/S-user
user@remotebox:~$
或者,如果screen
没有安装,您可以使用nohup
远程框上的命令。维基百科对此进行了很好的解释:
Nohupping backgrounded jobs is typically used to avoid terminating them when logging
off from a remote SSH session. A different issue that often arises in this situation
is that ssh is refusing to log off ("hangs"), since it refuses to lose any data
from/to the background job(s). This problem can also be overcome by redirecting all
three I/O streams:
nohup ./myprogram > foo.out 2> foo.err < /dev/null &
因此你可以做类似的事情:
ssh -n -f user@remotebox "sh -c 'cd /foo/bar; nohup ./myprogram > foo.out 2> foo.err < /dev/null &'"
答案2
~^z 执行后bg
,停止的进程将继续在后台执行。适用于所有进程,而不仅仅是 ssh。
PS:fg
再次将后台进程置于前台。仅供参考:~ 仅用于区分暂停是在本地计算机上(使用 ~ --> ssh 客户端)还是在服务器上(不使用 ~ --> 服务器上当前正在前台运行的任何进程)