我很想在不同的服务器上同时运行不同的脚本。(+/- 2 秒不是问题)条件是通过从主服务器调用而不是通过 Cron 计划来启动脚本。我尝试了 SSH,但这样我必须等到脚本在远程服务器上完成运行,然后才删除会话。我正在寻找一种替代方法,它允许在远程服务器上启动脚本而无需等待其结束。PS - 在我的用例中,我没有使用 CLI,而是使用外部脚本调用应用程序,它会触发主服务器上的脚本。谢谢。
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 -m从screen“分离”模式开始。这会创建一个新会话,但不会附加到它。这对于系统启动脚本很有用。
1如果您在使用systemd配置为的系统上killUserProcesses=yes,则需要替换screen为systemd-run --user --scope screen。
使用 '& disown' 将命令发送到一个子 shell,然后该子 shell 被拒绝。如果您需要进程跟踪,请使用 nohup。下面我使用封装在时间调用中的sleep二进制文件在控制台中提供有关正在发生的事情的快速反馈。
time sleep 5
Run Code Online (Sandbox Code Playgroud)
shell 正在阻塞,因此您将无法很好地退出会话。
time sleep 5 &
Run Code Online (Sandbox Code Playgroud)
是 subshelled,所以退出仍然会终止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)
| 归档时间: |
|
| 查看次数: |
3884 次 |
| 最近记录: |