温馨提示×

ubuntu虚拟机定时任务如何设置

小樊
40
2026-01-03 01:36:47
栏目: 云计算

Ubuntu 虚拟机定时任务设置指南

一 快速上手

  • 编辑当前用户的定时任务
    • 命令:crontab -e
    • 选择编辑器(首次会提示),在打开的文件中添加一行任务,保存退出即可生效
  • 常用管理
    • 查看:crontab -l
    • 删除全部:crontab -r(谨慎,建议用 -e 逐条删除)
    • 指定用户(root):sudo crontab -e
  • 说明
    • 任务以当前用户身份运行;如需系统级任务,可用 root 的 crontab 或放入系统目录(见下文进阶)

二 时间格式与常用示例

  • 时间字段顺序:分 时 日 月 周 命令(取值范围:分 0–59,时 0–23,日 1–31,月 1–12,周 0–6,0 表示周日)
  • 特殊符号
    • * 任意值;/ 间隔(如 */5 表示每 5 个单位);- 范围;, 枚举
  • 常用示例
    • 每 5 分钟:*/5 * * * * /usr/bin/python3 /home/ubuntu/do.py >> /home/ubuntu/cron.log 2>&1
    • 每天 03:30:30 3 * * * /usr/local/bin/backup.sh
    • 每周一 09:00:0 9 * * 1 /usr/bin/rsync -a /data /backup
    • 每月 1 日 00:00:0 0 1 * * /opt/scripts/monthly_report.sh
  • 实践建议
    • 脚本和文件路径尽量使用绝对路径
    • 命令输出建议重定向到日志文件,便于排查(如:>> /var/log/mytask.log 2>&1

三 服务管理与日志排查

  • 确认 cron 服务运行
    • 查看状态:sudo systemctl status cronservice cron status
    • 启动/停止/重启:sudo systemctl start|stop|restart cron
    • 开机自启:sudo systemctl enable cron
  • 开启并使用日志(Ubuntu 默认可能未写入 cron 日志)
    • 编辑:sudo nano /etc/rsyslog.d/50-default.conf,确保包含:cron. /var/log/cron.log*
    • 重启日志服务:sudo systemctl restart rsyslog
    • 查看日志:tail -f /var/log/cron.log
  • 虚拟机环境提示
    • 若使用 WSL2,可在 /etc/wsl.conf 中设置 systemd=true,重启 WSL 后使用 systemctl 管理 cron;WSL1 不支持 systemd
    • 大多数虚拟机与云服务器默认已启用 systemd,可直接使用 systemctl 管理

四 进阶用法与常见问题

  • 系统级任务与目录
    • 系统级计划任务可放入 /etc/cron.d/(文件需设置合适的属主与权限,通常以 root 维护)
    • 系统目录任务:/etc/cron.hourly/etc/cron.daily/etc/cron.weekly/etc/cron.monthly(由系统定时调用 run-parts 执行)
  • 权限控制
    • 可通过 /etc/cron.allow/etc/cron.deny 控制哪些用户可使用 crontab(存在 allow 时仅允许列表内用户)
  • 环境变量与路径
    • cron 环境与交互式登录不同,建议在任务中显式设置 PATH,或使用命令的绝对路径
    • 脚本首行指定解释器(如:#!/usr/bin/python3),并确保脚本有可执行权限chmod +x /path/script.sh
  • 每 30 秒执行
    • cron 最小粒度为1 分钟,可用“双任务 + 睡眠”实现:
      • * * * * * /usr/bin/python3 /home/ubuntu/do.py >> /home/ubuntu/run.log 2>&1
      • * * * * * sleep 30 && /usr/bin/python3 /home/ubuntu/do.py >> /home/ubuntu/run.log 2>&1
  • 常见排错清单
    • 命令是否使用绝对路径;脚本是否有可执行权限
    • 是否重定向了标准输出与错误输出(便于日志排查)
    • 是否已在 /etc/rsyslog.d/50-default.conf 启用 cron.* 并重启 rsyslog
    • 任务是否按预期时间运行(查看 /var/log/cron.log

0