如何在Monit中执行exec命令检测Git仓库变更?
在Monit中通过
git ls-files检测Git仓库变更的最佳实现方式 我之前也碰到过这个困惑——Monit文档里大多讲的是触发告警后执行命令,却没怎么提如何用命令执行结果作为检测条件。不过其实Monit支持直接基于exec命令的退出码来做状态检测,结合Git的命令就能完美实现仓库变更监控。
最终可运行的配置示例
这里是验证过的有效配置,基于@TheCodeKiller的思路调整而来:
# 监控目标Git仓库目录 check directory my_git_repo with path /var/www/my-project # 检测本地工作区与HEAD的差异:有变更时命令返回1,触发告警 if exec "/usr/bin/git --git-dir=/var/www/my-project/.git --work-tree=/var/www/my-project diff --quiet" != 0 then alert # 可选:如果需要自动拉取更新(根据需求开启) if exec "/usr/bin/git --git-dir=/var/www/my-project/.git --work-tree=/var/www/my-project diff --quiet" != 0 then exec "/usr/bin/git -C /var/www/my-project pull origin main"
关键逻辑说明
- 命令选择:我没有直接用
git ls-files -m(它仅列出修改过的文件,退出码始终为0),而是用git diff --quiet——这个命令在仓库无变更时返回0,存在未提交修改或与远程分支有差异时返回1,刚好适配Monit的检测规则。 - 绝对路径:务必指定
git的绝对路径(比如/usr/bin/git),同时明确Git仓库的--git-dir和--work-tree,避免Monit因环境变量问题找不到资源。 - 权限验证:要确保Monit运行的用户(通常是
monit或root)有访问Git仓库的权限,你可以手动切换到该用户执行一遍检测命令,确认能正常返回结果。
扩展:检测远程仓库变更
如果需要监控远程分支是否有新提交,可以把检测命令改成先拉取远程更新再对比:
if exec "/usr/bin/git -C /var/www/my-project fetch && /usr/bin/git -C /var/www/my-project diff --quiet origin/main main" != 0 then alert
这样就能精准捕捉到本地或远程的仓库变更啦!
内容的提问来源于stack exchange,提问作者Chuck Norton
相关产品推荐
相关产品推荐

