如何通过 ssh 启动长时间运行的后台进程并立即断开连接?

如何通过 ssh 启动长时间运行的后台进程并立即断开连接?

我想编写一个 bash 脚本,它可以 ssh 进入服务器,启动连续的后台进程(无限的 python 脚本)并退出服务器。这是我尝试过的:

ssh user@domain "python3 script.py &"

ssh user@domain "python3 script.py & exit"

ssh user@domain "nohup python3 script.py & exit"

他们都没有工作。该脚本成功启动,但我无法退出服务器并且它保持登录状态。

答案1

nohup命令没有按照您的想法进行操作 - 它忽略挂断信号,以便可以在终端驱动程序不发送SIGHUP到附加进程的情况下删除 STDIO 上的(终端)连接,但nohup不会关闭自己的 STDIO 连接,并且它在effect 将它们传递给它启动的进程,因此sshd将等待直到进程终止并且这些描述符因此被关闭。

因此,您需要确保您启动的进程也没有连接到由sshd(STDIN 已在 上打开/dev/null)为其提供的 STDOUT 和 STDERR 描述符,并且您可以通过将它们重定向(到文件或到/dev/null)来做到这一点。该nohup命令并不是严格需要的,因为SIGHUP当 SSH 连接断开时不会发送任何内容。

尝试这个:

ssh user@domain "python3 script >/dev/null 2>&1 &"

答案2

尝试终端多路复用器,tmux 很棒。我通常不喜欢在您可能需要安装某些东西的地方提供建议,但 tmux 是一个非常方便的应用程序,可以放在您的工具带中。 (可能已经安装)

您可以关闭包含在 tmux 中的应用程序,分离关闭您的笔记本电脑,转到其他地方重新登录并重新附加到仍在 tmux 中运行的会话。如果您的操作系统较旧,屏幕也会类似,但我更喜欢 tmux。

您可以从命令行启动新应用程序或像这样格式化的应用程序

tmux 新会话“command1”

tmux new-session "ping 8.8.8.8"

但您可能应该为您的会话命名。现在简写名为 muxping 的新会话,该会话在后台启动。 -d 是分离的。

tmux new -d -s muxping "ping 8.8.8.8"

现在在后台显示它

tmux ls

附加到它

tmux a

此外,您还可以在 tmux 中分屏并执行许多非常方便的操作。有许多网站都有 tmux 备忘单,可以简化大型手册页。上手非常容易。

相关内容