我想编写一个 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 备忘单,可以简化大型手册页。上手非常容易。