温馨提示×

ubuntu定时器启动方式

小樊
42
2025-12-06 09:39:33
栏目: 智能运维

Ubuntu 定时器启动方式

一、常用方式与适用场景

  • cron:最常用、轻量,适合固定周期的命令或脚本(如每天、每小时)。通过 crontab -e 管理任务,系统自带或可通过 sudo apt-get install cron 安装,常用命令有 crontab -l/-r
  • systemd timers:与 systemd 深度集成,适合需要与系统服务、日志、依赖、开机启动等联动的场景,支持按日历/间隔触发,文件位于 /etc/systemd/system/
  • at:一次性定时任务,适合临时在指定时间运行一次命令或脚本。
  • 事件触发:基于文件系统或网络事件的自动化(如 inotifywait 监视目录变化触发脚本),适合“当文件变动时执行”。

二、快速上手示例

  • cron
    • 编辑任务:crontab -e;查看:crontab -l
    • 示例(每天 06:00 执行脚本):0 6 * * * /path/to/backup.sh
    • 确保脚本可执行:chmod +x /path/to/backup.sh;必要时在 crontab 顶部设置 PATH
  • systemd timers
    • 服务单元 /etc/systemd/system/my_script.service
      • [Unit] Description=My script service
      • [Service] Type=simple; ExecStart=/path/to/script.sh; User=root; Group=root
    • 定时器单元 /etc/systemd/system/my_script.timer
      • [Unit] Description=Run my script every hour
      • [Timer] OnBootSec=1min; OnUnitActiveSec=1h; Unit=my_script.service
      • [Install] WantedBy=timers.target
    • 启用并启动:sudo systemctl enable --now my_script.timer;查看:systemctl list-timers;日志:journalctl -u my_script.service
  • at
    • 安装:sudo apt-get install at;一次性在 22:04 执行:echo “cmd” | at 22:04;查看队列:atq;删除:atrm
  • 事件触发(inotifywait)
    • 安装:sudo apt-get install inotify-tools;监视目录并触发脚本:
      • inotifywait -m /path/to/watch -e modify,create,delete | while read path action file; do /path/to/script.sh; done

三、如何选择

  • 固定周期、简单任务优先用 cron(上手快、维护成本低)。
  • 需要与 systemd 生态联动(依赖、日志、开机自启、精确日历/间隔)优先用 systemd timers
  • 只执行一次的临时任务用 at
  • 需要“文件/网络事件驱动”的自动化用 inotifywait 等事件触发方案。

四、常见问题与排查

  • 权限与环境
    • 脚本需可执行:chmod +x;cron 环境不同于登录环境,建议在 crontab 顶部显式设置 PATH,脚本内使用绝对路径
  • 服务未运行
    • cron:sudo service cron startsudo systemctl start cron
    • systemd timer:sudo systemctl enable --now your.timer;查看状态:systemctl status your.timer;列出所有定时器:systemctl list-timers
  • 日志与调试
    • cron 日志:编辑 /etc/rsyslog.d/50-default.conf,取消注释 cron. /var/log/cron.log*,重启 rsyslog:sudo service rsyslog restart,查看:tail -f /var/log/cron.log
    • systemd:查看服务日志:journalctl -u your.service,查看定时器日志:journalctl -u your.timer

0