如何让 ssh 进程处于后台?

如何让 ssh 进程处于后台?

我知道您可以使用 ~^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 客户端)还是在服务器上(不使用 ~ --> 服务器上当前正在前台运行的任何进程)

相关内容