Linux 定时任务是一种自动化工具,允许用户和系统管理员在预定的时间自动执行脚本、命令或程序。这些任务通常用于日常的系统维护、数据备份、监控和报告等。本文主要介绍一下Linux下设置定时任务常用的三种方法。

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=*-*-* *:*:00 表示每分钟触发一次定时器执行,

OnCalendar=*-10-15 00:00:00 表示每年的10月11号执行,

OnCalendar=*-*-* 01:00:00 表示每天凌晨 1 点触发执行。

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来实现精确到秒的计划任务。

推荐文档