Monit 无法启动 shell 脚本

Monit 无法启动 shell 脚本

因此我在 monit 启动进程时遇到问题,这是我的代码:

check process program_1
matching "program_1"
start program = "/home/user1/files/start.sh"
stop program = "/home/user1/files/stop.sh"

Monit 以 root 身份运行,无论如何,当我关闭进程时,monit 会注意到它并尝试重新启动它。但是它失败了。启动失败:/home/user1/files/start.sh 我也尝试过这个:

check process program_1
matching "program_1"
start program = "/bin/bash -c '/home/user1/files/start.sh'"
stop program = "/bin/bash -c '/home/user1/files/stop.sh'"

这也不起作用。它现在显示:启动失败:/bin/bash
我遗漏了什么吗?

答案1

Monit 匹配可能有点宽泛 - 例如,如果您匹配“sh”,它将始终认为您的程序正在运行。
尝试在您的 program_1 未运行时运行以下命令:

ps aux | grep program_1 | grep -v grep

如果您看到任何输出则说明您的匹配是错误的,请尝试缩小搜索模式。

作为最佳实践,我建议您让 program_1 写入 pid 文件并使用 monit pidfile 读取它:

check process program_1 with pidfile /run/program_1.pid

或者如果这不可能,请编写一个简短的脚本,实际检查您的程序是否正在运行,并返回 1 表示未运行,0 表示正在运行。
然后将您的脚本传递给 Monit,如下所示:

check program program_1 with path /etc/periodic/program_1_test.sh
if status != 0 then restart
start program = "/home/user1/files/start.sh"
stop program = "/home/user1/files/stop.sh"

还,绝不对以 root 身份运行的脚本执行 chmod 777。

答案2

有效,当我将 shell 解释器更改为 #!/bin/sh 而不是 #!/bin/bash 时,能够捕获 monit 环境变量此外,我试图执行扩展名为“.sh”的 shell 脚本 #!/bin/sh #echo $1 > /temp/file2 { echo "MONIT_SERVICE is $MONIT_SERVICE" echo "MONIT_EVENT is $MONIT_EVENT" echo "MONIT_DESCRIPTION is $MONIT_DESCRIPTION" } >> /temp/file2

答案3

我认为可能是该文件没有在没有 bash 的情况下运行的权限(应该可以通过运行“chmod +x”来纠正,并且第二个命令不应该包含“-c”切换到 bash,并且文件名也不需要加引号。

答案4

(应该是评论,但是有点长)

我在 start.sh 上运行了 chmod 777

呃。这就像是用大锤子攻击问题。

你没有说这一切是在什么上运行的。我建议检查一下

1)如果它在 chroot 环境中运行(如果它以 root 身份运行,这将是打包程序的合理预防措施)

2) 如果您有 SELinux(或其他强制访问控制系统,如 Smack 或 AppArmor)。您应该会看到一些与您尝试运行的脚本相关的日志活动。

相关内容