可以,而且有多种成熟方式按时间、事件或系统状态来自定义 Linux 的“触发器”。常见做法包括:基于时间的 cron 与 systemd Timer,基于事件的 inotify 文件监控与 udev 设备事件,以及系统级事件与登录会话的 systemd 路径/服务单元 等。下面给出对照与可直接复用的示例。
常见场景与工具选择
| 场景 | 推荐工具 | 关键配置点 |
|---|---|---|
| 按时间周期执行 | cron、systemd Timer | cron 使用五字段时间语法;Timer 使用 OnCalendar 等字段 |
| 文件或目录变更 | inotifywait(inotify-tools) | 监控 create/modify/delete 等事件并调用脚本 |
| 设备插拔 | udev 规则 | 匹配 ACTION/SUBSYSTEM/ATTR 并执行脚本 |
| 系统启动、登录、路径变化 | systemd service/timer/path | After/Requires/WantedBy;Path Unit 的 PathChanged 等 |
| 登录/会话事件 | systemd-logind | 监听会话状态变化触发动作 |
快速上手示例
定时触发(每小时执行)
# 编辑当前用户定时任务
crontab -e
# 每小时执行一次
0 * * * * /usr/local/bin/backup.sh
# /etc/systemd/system/backup.service
[Unit]
Description=Hourly Backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup hourly
[Timer]
OnCalendar=*-*-* *:00:00
Persistent=true
[Install]
WantedBy=timers.target
启用与查看:sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers --all
文件变更触发(inotifywait)
# 安装工具
sudo apt-get install inotify-tools # Debian/Ubuntu
sudo yum install inotify-tools # CentOS/RHEL
# 监控目录并在事件发生时执行脚本
inotifywait -m /data/watch -e create,modify,delete |
while read path action file; do
/usr/local/bin/handle.sh "$path" "$action" "$file"
done
设备插入触发(udev)
# /etc/udev/rules.d/99-usb-backup.rules
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", \
RUN+="/usr/local/bin/usb-backup.sh %k"
# 重新加载规则并触发
sudo udevadm control --reload-rules
sudo udevadm trigger
实践建议