Monit中exec指令触发后无执行效果问题排查求助
Monit exec指令不执行问题排查与解决方案
可能原因及对应解决步骤
1. 脚本或目录权限不足
Monit默认以root或monit用户运行,若脚本无执行权限、Monit用户无读取/执行脚本的权限,会导致执行失败。
- 验证:执行
ls -l /home/ubuntu/bot/run_shell.sh,确认权限包含rx(比如755或700);执行ps aux | grep monit查看Monit运行用户。 - 解决:
- 给脚本加执行权限:
chmod +x /home/ubuntu/bot/run_shell.sh - 若Monit以普通用户运行,调整目录权限:
chown -R monit:monit /home/ubuntu/bot/(替换monit为实际运行用户)
- 给脚本加执行权限:
2. 环境变量差异
手动执行的环境变量(如PATH)和Monit运行时的环境不一致,会导致脚本内命令找不到。
- 验证:在脚本开头添加环境变量输出:
触发exec后,对比#!/usr/bin/env bash env > /home/ubuntu/bot/monit_env.logmonit_env.log和手动执行env > manual_env.log的内容,找出差异。 - 解决:脚本内所有命令使用绝对路径(比如
/bin/echo而非echo),或在脚本开头手动设置必要环境变量(如export PATH=/usr/bin:/bin:$PATH)。
3. 执行上下文与输出问题
Monit执行exec时无交互式终端,标准输出/错误默认被丢弃或重定向到Monit日志,导致看起来没执行;且Monit默认不等待脚本执行完成。
- 验证:修改脚本写入执行日志:
触发exec后查看#!/usr/bin/env bash echo "[$(date)] 脚本启动" >> /home/ubuntu/bot/script_exec.log 2>&1 /usr/bin/python3.11 /home/ubuntu/bot/my_bot.py >> /home/ubuntu/bot/script_exec.log 2>&1 echo "[$(date)] 脚本结束" >> /home/ubuntu/bot/script_exec.log 2>&1script_exec.log,确认是否有内容。 - 解决:在Monit配置中指定以手动执行的用户运行脚本,消除权限/环境差异:
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" as uid ubuntu gid ubuntu
4. 安全模块限制
Ubuntu默认启用的AppArmor可能限制Monit执行外部脚本。
- 验证:临时关闭AppArmor测试:
sudo systemctl stop apparmor,重新加载Monitsudo monit reload后触发exec,看是否正常执行。 - 解决:若关闭后正常,修改Monit的AppArmor配置文件(一般在
/etc/apparmor.d/目录),添加脚本路径的允许规则,例如在对应文件中增加:/home/ubuntu/bot/run_shell.sh r, /home/ubuntu/bot/run_shell.sh x,
5. 配置语法或周期问题
- 验证:执行
monit -t检查配置语法,若输出Control file syntax OK则无语法错误;检查/etc/monit/monitrc中的set daemon参数,确认循环周期(比如set daemon 30表示每30秒检查一次),确保for 2 cycles的触发时间符合预期。 - 解决:修复语法错误,调整周期参数至合理范围。
快速排查流程
- 给脚本添加日志输出,确认是否真的未执行;
- 检查脚本及目录的权限、Monit运行用户的权限;
- 对比手动与Monit的环境变量差异;
- 尝试指定用户执行脚本;
- 排查安全模块(AppArmor)的限制。
内容的提问来源于stack exchange,提问作者DCS stream
相关产品推荐
相关产品推荐

