Ubuntu自定义Trigger的常见方法
在Ubuntu系统中,Trigger(触发器)的核心作用是在特定事件或时间条件满足时,自动执行预定义的操作(如运行脚本、启动服务等)。以下是几种常用的自定义Trigger方法,覆盖文件系统监控、定时任务、系统日志事件等多种场景:
Systemd是Ubuntu默认的服务管理工具,通过**服务单元文件(.service)**定义要执行的操作,**定时器单元文件(.timer)**定义触发条件(时间或事件),适合需要精准调度的场景。
/usr/local/bin/backup_script.sh),并赋予可执行权限:sudo nano /usr/local/bin/backup_script.sh
# 写入自定义逻辑(例如备份文件)
#!/bin/bash
tar -czf /backup/$(date +%F).tar.gz /home/user/Documents
sudo chmod +x /usr/local/bin/backup_script.sh
Type=oneshot表示一次性执行):sudo nano /etc/systemd/system/backup_service.service
# 内容示例:
[Unit]
Description=Daily Backup Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup_script.sh
sudo nano /etc/systemd/system/backup_timer.timer
# 内容示例(每天凌晨2点触发):
[Unit]
Description=Run backup daily at 2 AM
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true # 若错过时间,下次启动时补执行
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now backup_timer.timer
# 查看定时器状态(确认是否生效)
sudo systemctl list-timers --all
此时,系统会在每天凌晨2点自动执行backup_script.sh。inotify是Linux内核提供的文件系统监控机制,可实时响应文件的创建、修改、删除、移动等事件,适合需要即时触发的场景(如文件上传后自动处理)。
sudo apt-get install inotify-tools
inotifywait命令监控指定目录,当事件发生时执行自定义操作(如示例中监控/data/uploads目录,当有.txt文件创建时发送邮件):sudo nano /usr/local/bin/file_monitor.sh
# 内容示例:
#!/bin/bash
WATCH_DIR="/data/uploads"
inotifywait -m -e create --format '%f' "$WATCH_DIR" | while read FILE
do
if [[ "$FILE" == *.txt ]]; then
echo "New text file detected: $FILE" | mail -s "File Alert" admin@example.com
fi
done
sudo chmod +x /usr/local/bin/file_monitor.sh
rc.local(需赋予执行权限)或创建Systemd服务,确保系统重启后仍能监控:sudo nano /etc/rc.local
# 在exit 0前添加:
/usr/local/bin/file_monitor.sh &
sudo chmod +x /etc/rc.local
此时,当/data/uploads目录下有新的.txt文件创建时,脚本会自动发送邮件通知。cron是Ubuntu传统的定时任务工具,适合需要按固定时间周期触发任务的场景(如每天备份、每周报表生成)。
crontab -e命令打开当前用户的cron配置文件,添加定时任务:crontab -e
# 示例:每天凌晨3点执行备份脚本
0 3 * * * /usr/local/bin/backup_script.sh
# 示例:每5分钟检查一次磁盘空间
*/5 * * * * df -h >> /var/log/disk_usage.log
grep CRON /var/log/syslog
注意:cron的环境变量可能与用户终端不同,建议在脚本中使用绝对路径(如/usr/bin/df而非df)。对于复杂的触发逻辑(如网络请求、数据库查询),可使用Python编写灵活的触发器脚本,结合time.sleep()实现轮询或threading实现异步监控。
import time
import subprocess
LOG_FILE = "/var/log/python_trigger.log"
def check_logs():
result = subprocess.run(['grep', 'error', '/var/log/syslog'], capture_output=True, text=True)
if result.stdout:
with open(LOG_FILE, 'a') as f:
f.write(f"[{time.ctime()}] Error found in syslog:\n{result.stdout}\n")
if __name__ == "__main__":
while True:
check_logs()
time.sleep(60) # 每分钟检查一次
chmod +x /usr/local/bin/python_trigger.py
nohup /usr/local/bin/python_trigger.py > /dev/null 2>&1 & # 后台运行
此时,脚本会持续运行,当系统日志中出现“error”时,自动记录到/var/log/python_trigger.log。chmod +x),避免因权限不足导致无法运行。/var/log/目录),便于排查问题。sudo systemctl start my_custom_service.service)或模拟事件(如在监控目录下创建文件),确认触发器是否正常工作。以上方法覆盖了Ubuntu系统下常见的Trigger自定义需求,可根据具体场景选择合适的方式。