我在 Ubuntu 22.04.3 LTS 上有 Monit 5.31.0,我很难理解为什么 exec 不起作用。
我有一个网站的监控文件,例如:
check host all with address google.com
group test
if failed url https://google.com with content = 'nothing' for 2 cycles
then exec "/home/ubuntu/bot/run_shell.sh"
这故意触发错误(用于测试)并应执行脚本 /home/ubuntu/bot/run_shell.sh
脚本内容很简单: (我试图最大限度地简化脚本 - “echo 123”结果是一样的)
#!/usr/bin/env bash
/usr/bin/python3.11 /home/ubuntu/bot/my_bot.py
如果我在控制台中手动运行脚本:
./run_shell.sh 或者 /home/ubuntu/bot/run_shell.sh 一切正常并且脚本运行。
在监控日志中:
[2023-08-11T16:56:45+0300] info : Reinitializing monit daemon
[2023-08-11T16:56:45+0300] info : Reinitializing Monit -- control file '/etc/monit/monitrc'
[2023-08-11T16:56:45+0300] info : Monit reloaded
[2023-08-11T16:56:45+0300] warning : 'all' failed protocol test [HTTP] at [google.com]:443/ [TCP/IP TLS] -- Network is unreachable
[2023-08-11T16:57:15+0300] error : 'all' failed protocol test [HTTP] at [google.com]:443/ [TCP/IP TLS] -- Network is unreachable
[2023-08-11T16:57:15+0300] info : 'all' exec: '/home/ubuntu/bot/run_shell.sh'
我在日志中看到行 'all' exec: '/home/ubuntu/bot/run_shell.sh',但脚本没有被执行。
我也尝试添加 exec "/bin/bash /home/ubuntu/bot/run_shell.sh" 但仍然不起作用。
您能帮我找出问题所在吗?
我尝试过的:
在控制台中使用 ./run_shell.sh 和 /home/ubuntu/bot/run_shell.sh 手动运行脚本,效果符合预期。 使用 Monit 配置中提供的原始执行行。 修改 exec 行以显式调用 Bash 解释器。 预期结果:
我期望Monit配置中的exec行能够触发/home/ubuntu/bot/run_shell.sh的执行,从而导致Python脚本成功执行。
实际结果:
尽管在日志中看到 'all' exec: '/home/ubuntu/bot/run_shell.sh' 行,但该脚本在由 Monit 触发时不会执行。
任何有关如何解决此问题的见解或建议将不胜感激。预先感谢您的协助!
因为
exec
没有保存输出,您是否确保脚本真的没有执行?例如,在第一行写一些东西,比如
#!/usr/bin/env bash
touch /tmp/monit-is-writing-this-file-yay
/usr/bin/python3.11 /home/ubuntu/bot/my_bot.py
由于 monit 不会记录执行脚本时出现的问题,因此问题源应该位于您的脚本内部。一个可能的问题(根据设计)是,monit 不提供环境!因此,如果 python 或您的机器人依赖于 ENV 提供的任何内容,您必须在脚本中手动设置它,例如
#!/usr/bin/env bash
# manually set env
export PYTHON_WHATEVER="yes, please"
export MYBOT_DATABASE="postgresql://user:pass@host:port/db"
# and/or write env to be able to check it:
env > /tmp/my_bot.env
/usr/bin/python3.11 /home/ubuntu/bot/my_bot.py
PS:如果您的脚本具有
+x
标志和正确的 shebang(它有!),它将毫无问题地执行。无需手动设置解释器,所以exec "/home/ubuntu/bot/run_shell.sh"
就是正确的方法。