在远程服务器上运行 bash 而不用等到最后

fac*_*ess 5 linux shell bash

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

Fox*_*Fox 7

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

#!/bin/sh
ssh server1 screen -d -m command1
ssh server2 screen -d -m command2
# ...
Run Code Online (Sandbox Code Playgroud)

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

摘自手册,screen(1)

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


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


Not*_*ick 5

使用 '& disown' 将命令发送到一个子 shell,然后该子 shell 被拒绝。如果您需要进程跟踪,请使用 nohup。下面我使用封装在时间调用中的sleep二进制文件在控制台中提供有关正在发生的事情的快速反馈。

time sleep 5
Run Code Online (Sandbox Code Playgroud)

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

time sleep 5 &
Run Code Online (Sandbox Code Playgroud)

是 subshel​​led,所以退出仍然会终止sleep 命令。

time nohup sleep 5 &
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash

nohup sleep 500 & disown
pid=$!
echo $pid > /tmp/time.pid
exit 0
Run Code Online (Sandbox Code Playgroud)