1、使用 cron 设置定时任务
cron 是 Linux 中最常用的定时任务调度器。它允许用户在指定的日期和时间运行脚本和命令。使用 cron 设置定时任务的三种方法如下,
1)编辑用户的 crontab 文件
用于单个用户设置定时任务,打开用户的 crontab
文件,命令如下,
crontab -e
在 crontab 文件中,添加一行来定义定时任务,格式如下,
分 时 日 月 周 命令
例如,
每天凌晨3点运行脚本,如下,
0 1 * * * /path/to/script.sh
添加完成后,保存文件退出。
2)使用预定义的 cron 目录
Linux 系统通常包含一些预定义的目录,用于存放定期执行的脚本,目录如下,
/etc/cron.daily /etc/cron.hourly /etc/cron.weekly /etc/cron.monthly
系统将按照目录名称指定的频率执行这些脚本。另外还需要将脚本添加执行权限。例如,
chmod +x /path/to/script.sh
3)在 /etc/crontab 文件中添加任务
对于系统级的任务,可以直接在 /etc/crontab
文件中添加,添加方法和用户的crontab
文件中添加方法差不多,但多了一个用户的字段,格式如下,
分 时 日 月 周 用户 命令
例如,
以 root 每天凌晨3点运行脚本,如下,
0 3 * * * root /path/to/script.sh
2、使用 at 设置定时任务
用于设置一次性任务,它会在指定的时间运行一次任务。它允许指定将在未来某个时间点执行的命令。
1)安装 at
在某些 Linux 发行版中,at 服务可能默认没有安装。您可以使用包管理器进行安装:
对于基于 Debian/Ubuntu 的系统:
sudo apt-get install at
对于基于 RedHat/CentOS 的系统:
sudo yum install at
2)启动 at 服务
启动并设置开机自动启动:
sudo systemctl start atd sudo systemctl enable atd
3)使用 at 设置定时任务
使用 at
后跟执行任务的时间来设置定时任务。at
接受多种时间格式,例如,
在今天下午 10:30 执行脚本:
echo "/path/to/script.sh" | at 22:30
在当前时间之后的 30 分钟执行脚本:
echo "/path/to/script.sh" | at now + 30 minutes
4)管理 at 任务
列出待执行的 at
任务,使用命令如下,
atq
删除 at
任务,使用命令如下,
atrm <job number>
可以查看任务脚本中指定的日志文件或输出文件,来检查任务执行状态。
3、使用 systemd 定时器设置定时任务
systemd 定时器是一种替代传统 cron 的方法,用于安排定时任务。systemd 定时器由两部分组成:一个 .service
文件和一个 .timer
文件。.service
文件定义了要执行的任务,而 .timer
文件设定了何时执行这个任务。
1)创建服务文件
创建一个 .service 文件来定义要执行的任务。例如,
创建 /etc/systemd/system/mytask.service
文件,内容如下,
[Unit] Description=checkIP [Service] Type=simple ExecStart=/root/chechIP.sh
脚本添加执行权限:
chmod +x /root/chechIP.sh
2)创建 .timer 文件
.service
文件创建完成后,还需要创建一个定时器文件(.timer
),例如,
创建 /etc/systemd/system/mytask.timer 文件,内容如下,
[Unit]
Description=checkIP every 30s
[Timer]
# Time to wait after enable this unit
OnActiveSec=60
# Time between running each consecutive time
OnUnitActiveSec=30
Unit=mytask.service
[Install]
WantedBy=multi-user.target
systemd 定时器可用选项:
选项 | 描述 |
OnActiveSec | 定时器生效后,多少时间开始执行任务。 如, OnUnitActiveSec=1h表示一小时执行一次任务, OnUnitActiveSec=*-*-* 02:00:00表示每天凌晨两点执行, OnUnitActiveSec=Mon *-*-* 02:00:00表示每周一凌晨两点执行。 |
OnBootSec | 系统启动后,多少时间开始执行任务。 |
OnStartupSec | Systemd 进程启动后,多少时间开始执行任务。 |
OnUnitActiveSec | 该单元上次执行后,等多少时间再次执行。 |
OnUnitInactiveSec | 定时器上次关闭后多少时间,再次执行。 |
OnCalendar | 基于绝对时间,而不是相对时间执行。 如, OnCalendar= OnCalendar= OnCalendar= |
AccuracySec | 如果任务必须推迟执行,推迟的最大秒数,默认是 60 秒。 |
Unit | 要执行的实际任务, 通常是同名的带有 .service 后缀的单元。 |
Persistent | 如果设置了该字段, 即使定时器到时没有启动, 也会自动执行相应的单元。 |
WakeSystem | 如果系统休眠,是否自动唤醒系统。 |
3)定时器使用相关命令
操作 | 命令 |
重新加载 systemd 配置 | sudo systemctl daemon-reload |
启动定时器 | sudo systemctl start mytask.timer |
设置定时器在启动时自动启动 | sudo systemctl enable mytask.timer |
查看定时器状态 | systemctl status mytask.timer |
列出所有定时器 | systemctl list-timers |
查看日志(调试或检查任务执行情况) | journalctl -u mytask.service |
注意:确保 .service
和 .timer
文件的命名一致并且放置在正确的目录中,通常是 /etc/systemd/system/
。
OnCalendar 配置使用 systemd 时间格式,可以设置为具体的时间点,也可以使用其它更复杂的时间规则。
Persistent=true
表示如果错过了某次执行(比如系统未运行),下次启动时将会尽快执行该任务。如有任务的需要定时执行需要精确到秒,在基于systemd的系统上,则可以通过计时器systemd.timer
来实现精确到秒的计划任务。