我有一个服务器列表和需要在服务器上执行的 Bash 脚本。例如,我有一个脚本,用于在服务器上安排 cronjob(使用用户指定的命令)。这只是一个例子,我有用于删除 cronjob、存储 SSH 密钥、配置主管来启动守护进程等的脚本。
我以编程方式通过 SSH 连接到服务器,并希望在远程服务器上执行这些脚本,但“在后台”。当我说“在后台”时,我的意思是我的代码应该完成,而不用担心实际脚本运行的时间。这是因为我的代码在阻塞语言 (PHP) 上运行,并且某些脚本可能会运行几分钟。我想通过 SSH 在服务器上发送一个脚本,运行它,不用担心其余的事情——我在脚本完成运行后卷曲我的服务器(有点像 webhook)。
为了保留本地文件系统存储,每个脚本在使用用户内容(对于 cronjob 来说可以是命令和 cron 表达式)修改后都表示为字符串,而不是存储在我的本地服务器上的文件中。示例:我有一个脚本echo "{{name}}"
,用户提供了“名称”变量,该变量以编程方式插入到脚本中。我不想在我的文件系统上存储用户提供的每个脚本修改。
我现在这样做的方式是从我的服务器执行此命令:
ssh -T user@host /bin/bash <<EOFX\n{{script}}EOFX
它被包装在 PHP 命令中以执行 shell 命令并被{{script}}
替换为:
#!/bin/bash
cat << 'EOFY' > ./script.sh
{{executionScript}}
EOFY
. ./script.sh > ./script.out
curl --data "status=$(echo $?)" myserver.com
在这种情况下,{{executionScript}}
将被替换为需要在服务器上运行的最终脚本的修改版本(例如echo "John Doe"
)
到目前为止,这一直运行良好,但此 SSH 命令会等待此脚本完成运行。如果我在sleep 4
before加上 a curl
,我的代码(执行 SSH 命令)将再等待 4 秒。
有没有办法运行需要在后台运行某个脚本的SSH命令?
我已经向您提供了我想要实现的目标的高级概述,希望有人能够为我的问题提供更好的解决方案(在服务器上执行一组用户修改的脚本)。我知道这是一块 Unix/Linux 板,我的主要问题是等待脚本完成的 SSH 命令。
答案1
使用命令 shell 时,在命令前添加 nohup 可以防止在您注销或退出 shell 时自动中止该命令。
nohup mycommand &
或者
ssh -n -f user@host "sh -c 'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"
即使您断开连接,它也应该继续运行。