monit支持文件元数据监控但不监控内容变化;常用场景包括防日志无限增长、检测清空或覆盖;通过if size、if changed timestamp、if changed checksum等规则触发告警或执行命令。

monit 直接支持文件监控,不需要额外脚本或轮询工具——但必须明确:它不监控“内容变化”,只监控元数据(大小、时间戳、校验和、权限)是否异常。想靠它发现日志被篡改或配置被覆盖?可以;想实时捕获某行文本新增?不行。
监控文件大小或修改时间变更
最常用场景是防止单个日志或配置文件无限增长、或被意外清空/覆盖。monit 用 if changed 或 if size 判断,触发 alert 或 exec。
-
if changed timestamp:文件 mtime 变更即告警(比如有人touch或cp覆盖) -
if size > 100MB:适合日志文件,超限发邮件或执行压缩脚本 -
if size = 0:检测空文件(如被> /var/log/app.log清空)
示例(监控 Nginx 访问日志):
check file nginx_access with path /var/log/nginx/access.log if size > 50MB then alert if changed timestamp then alert if size = 0 then exec "/bin/sh -c 'echo $(date) - log truncated | mail -s 'NGINX LOG RESET' admin@local'"
用 checksum 监控关键配置文件完整性
校验和监控适用于 /etc/ssh/sshd_config、/etc/nginx/nginx.conf 这类绝不该被随意修改的文件。注意:monit 默认只在启动时计算一次 checksum,后续靠定期重读比对——所以必须确保 set daemon 间隔合理(比如 30 秒),否则变更后要等下一个周期才触发。
- 首次运行前手动初始化 checksum:
monit -I -c /etc/monit.conf(-I强制初始化状态) - 配置中必须写绝对路径,且
monit进程要有读取权限(常见坑:SELinux 或 root-only 文件) - 不支持通配符,每个文件需单独
check file块
示例:
check file sshd_config with path /etc/ssh/sshd_config if changed checksum then alert group security
监控目录是否存在或权限异常
目录监控常被忽略,但它能快速发现挂载点丢失、umount 误操作、或权限被降级(比如 /var/lib/mysql 被改成 777)。
-
if does not exist:挂载点消失、rm -rf误删目录时立即响应 -
if permission != 755:防止敏感目录被开放写入 -
if uid != 0 or gid != 0:检测属主异常(如被普通用户chown)
注意:monit 不递归检查子目录或文件,只看目标目录自身的属性。想监控整个 /var/www 下任意文件变动?得用 inotifywait 配合外部脚本,monit 只能做兜底。
告警不触发?先查这三件事
配置写完 monit reload 后没反应,90% 是以下问题:
-
monit -t报错但被忽略:语法错误(比如漏了with path)、路径不存在、权限不足 - 日志静默:确认
set logfile指向可写位置,且monit进程有写入权限(常见于/var/log/monit.log所有者是root:root,而 monit 以非 root 用户跑) - 告警被抑制:全局配置里写了
set alert ... with reminder on 5 cycles,但你只等了 1 次检测——实际要等满 5 个周期才重复发
真正难调试的是「变更未被捕获」:比如你 echo "test" >> file,但 if changed timestamp 没触发——因为 echo 不改 mtime,只改 atime/ctime;此时得换 if changed size 或直接上 inotify。











