inotify
和 systemd.path
都能做到"文件变化时触发操作"。
方案一:inotify
工具(轻量级脚本方式)
1. 安装工具
bash
sudo apt install inotify-tools # Debian/Ubuntu
sudo yum install inotify-tools # RHEL/CentOS
2. 写一个监控脚本
比如:监控 /tmp/test.txt
,如果文件变化,就自动执行脚本
bash
#!/bin/bash
FILE="/tmp/test.txt"
inotifywait -m -e modify "$FILE" | while read path action file; do
echo "$(date): $FILE was modified, action=$action" >> /tmp/filewatch.log
# 这里可以执行任意操作,比如重启服务
# systemctl restart myapp.service
done
保存为 watch_file.sh
,加执行权限:
bash
chmod +x watch_file.sh
3. 运行
bash
./watch_file.sh
现在只要 echo "hello" >> /tmp/test.txt
,日志就会写入 /tmp/filewatch.log
。
方案二:systemd.path
(更稳定的服务化方式)
适合长期运行的监控,不需要自己写循环。
1. 创建 .path
单元
/etc/systemd/system/filewatch.path
ini
[Unit]
Description=Watch /tmp/test.txt changes
[Path]
PathChanged=/tmp/test.txt
[Install]
WantedBy=multi-user.target
2. 创建对应的 .service
单元
/etc/systemd/system/filewatch.service
ini
[Unit]
Description=Action when /tmp/test.txt changes
[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c 'echo "$(date): /tmp/test.txt changed" >> /tmp/filewatch.log'
3. 启动
bash
sudo systemctl daemon-reload
sudo systemctl enable --now filewatch.path
现在,每次 /tmp/test.txt
变化时,systemd
就会自动调用 filewatch.service
。
对比总结
特性 | inotifywait 脚本 | systemd.path |
---|---|---|
部署复杂度 | 简单,直接写脚本 | 稍复杂,要写 .path + .service |
运行方式 | 前台/后台脚本 | systemd 接管,稳定守护 |
适合场景 | 临时监控,调试 | 长期运行,系统级服务 |