在远程服务器上运行 bash,无需等待结束

在远程服务器上运行 bash,无需等待结束

我迫切希望在不同的服务器上同时运行不同的脚本。 (+/- 2 秒不是问题)条件是通过主服务器的调用来启动脚本,而不是通过 Cron 计划。我尝试了 SSH,但这样我必须等到脚本在远程服务器上运行完成,然后才能删除会话。我正在寻找一种替代方法,允许在远程服务器上启动脚本而无需等待其结束。 PS - 我在用例中没有使用 CLI,而是使用外部脚本调用应用程序,该应用程序会触发主服务器上的脚本。谢谢。

答案1

GNUscreen将允许您在不保持与服务器连接的情况下执行远程作业,除非systemd在注销时杀死所有进程的系统1。具体来说,您可以使用:

#!/bin/sh
ssh server1 screen -d -m command1
ssh server2 screen -d -m command2
# ...

每个本地ssh会话在启动远程screen进程后立即终止,而远程进程又在执行的命令完成后立即退出。您可以在每条ssh线后添加 后缀以&进行并行连接。

手册摘录screen(1)

-d -mscreen以“分离”模式 启动。这会创建一个新会话,但不会附加到它。这对于系统启动脚本很有用。


1如果您的系统使用systemd配置为killUserProcesses=yes,则需要替换screensystemd-run --user --scope screen

答案2

使用“& disown”将命令发送到随后被拒绝的子 shell。如果需要进程跟踪,请使用 nohup。下面我用的是睡觉二进制文件包裹在时间调用以在控制台中快速反馈正在发生的情况。

time sleep 5

shell 正在阻塞,因此您将无法很好地退出会话。

time sleep 5 &

已分壳,因此退出仍会杀人睡眠命令。

time nohup sleep 5 &

这会对 nohup 进行子 shell 处理,因此您会因为日志记录而做得更好,但是子 shell 仍将附加到创建它的 shell,因此当会话结束时,它及其进程将被销毁。你真的只需要否认它:

#!/bin/bash

nohup sleep 500 & disown
pid=$!
echo $pid > /tmp/time.pid
exit 0

相关内容