一、系统服务触发器(基于systemd)
系统服务触发器通过systemd的单元文件实现,适用于在系统事件(如启动、停止)或时间条件满足时自动启动/停止服务。
首先创建服务的.service文件(如/etc/systemd/system/my_service.service),定义服务的基本信息和执行逻辑:
[Unit]
Description=My Custom Service
After=network.target # 确保网络服务启动后再运行本服务
[Service]
ExecStart=/usr/bin/my_service_executable # 替换为实际的可执行文件路径
Restart=on-failure # 服务失败时自动重启
[Install]
WantedBy=multi-user.target # 设置为多用户模式启动
保存后执行sudo systemctl daemon-reload重新加载systemd配置。
若需基于特定事件(如网络启动、定时)触发服务,可创建.trigger文件(如/etc/systemd/system/my_service.trigger):
[Unit]
Description=Trigger for My Custom Service
[Trigger]
OnNetworkUp=* # 网络启动时触发
OnBootSec=10s # 系统启动后10秒触发
需配合WantedBy=multi-user.target启用。
sudo systemctl enable my_service.service # 开机自启动
sudo systemctl start my_service.service # 立即启动
sudo systemctl list-units --type=triggersudo journalctl -u my_service.service(排查触发失败问题)。二、定时任务触发器(基于systemd定时器)
systemd定时器提供更灵活的时间触发机制,适用于周期性任务(如每小时、每天执行)。
定义要执行的任务(如/etc/systemd/system/my_task.service):
[Unit]
Description=My Scheduled Task
[Service]
ExecStart=/usr/bin/echo "Task executed at $(date)" >> /tmp/task.log # 示例:记录执行时间
创建对应的.timer文件(如/etc/systemd/system/my_task.timer),设置触发时间:
[Unit]
Description=Run My Task hourly
[Timer]
OnCalendar=*-*-* *:00:00 # 每小时整点触发
Persistent=true # 若错过触发时间,下次启动时补执行
[Install]
WantedBy=timers.target # 关联到timers.target
sudo systemctl enable --now my_task.timer # 启用并立即启动(首次触发按OnCalendar计算)
sudo systemctl list-timers --allsudo systemctl status my_task.timer。三、事件驱动触发器(基于inotify-tools)
适用于监听文件系统事件(如文件修改、创建、删除),触发相应脚本。
sudo yum install inotify-tools -y
创建脚本(如/usr/local/bin/watch_file.sh),监听指定目录并触发操作:
#!/bin/bash
inotifywait -m /path/to/watch -e modify,create,delete | while read path action file; do
echo "File $file in $path was $action at $(date)" >> /tmp/inotify.log
/path/to/your/script.sh "$file" # 触发的目标脚本(替换为实际路径)
done
赋予执行权限:sudo chmod +x /usr/local/bin/watch_file.sh。
nohup /usr/local/bin/watch_file.sh & # 后台运行(避免终端关闭终止)
四、数据库触发器(以MySQL为例)
适用于数据库操作(如INSERT、UPDATE)时自动执行逻辑,需登录数据库操作。
mysql -u root -p
以users表为例,在插入前自动设置status字段:
DELIMITER //
CREATE TRIGGER before_insert_user
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
SET NEW.status = 'active'; -- 插入前将status设为active
END;
//
DELIMITER ;
验证触发器:插入一条数据后查询status字段是否自动填充。