概要
Systemd定时任务、crontab和at都是在Linux系统中用于执行定时任务或一次性任务的工具,但它们在使用方式、配置和管理方面存在一些差异。
Systemd定时任务:
Systemd是Linux系统的初始化进程,可以管理系统的各种服务,包括定时任务。Systemd的定时任务管理非常灵活,可以根据时间、事件等多种方式进行配置。它的定时任务配置文件通常以.timer为后缀,放置在/etc/systemd/system目录下。此外,Systemd定时任务还可以设置内存和CPU的使用额度,可以拆分任务,依赖其他Systemd单元完成非常复杂的任务。
crontab:
Crontab是一个独立的进程,专门用于定时任务的管理。它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。Crontab文件包含一系列计划任务条目,每个条目都定义了一个任务的执行时间和要运行的命令或脚本。这些任务可以按照分钟、小时、日、月和星期等不同的时间单位进行安排。Crontab支持更多的配置选项,可以实现更为复杂的定时调度。
at:
AT命令有两种解释,一种是调制解调器命令语言,另一种是Windows中的计划任务命令行。在Linux中,AT命令用于在指定时间执行一次性任务。用户需要指定一个时间,然后输入要执行的命令。时间可以用多种格式指定,包括绝对时间(如10:30)和相对时间(如now + 1 hour)。
总的来说,这三种工具都为Linux用户提供了强大的定时任务管理功能,用户可以根据具体需求选择适合的工具来
整体架构流程
Systemd
单调定时器
实时定时器
对比
crontab
at
技术细节
单调定时器
- 编写任务脚本文件(文件名可随意)。
在/root下创建一个mytimer.sh脚本,在里面输出`date`命令,并在临时目录下创建mylog.txt记录
vim mytimer.sh
然后输入命令授予该脚本可执行权限
Chmod +x (脚本文件绝对路径)
最后bash命令启动脚本
2.编写一个配套的单元服务文件,命名(*.service) boot_backup.service,保存在/etc/systemd/system目录中。内容如下:
[Unit]
Description=Backup boot
[Service]
Type=simple
ExecStart=/bin/bash /root/mytimer.sh
其中
Type值为simple(默认值),如果设置为oneshot该服务单元仅执行一次,之后退出,系统关闭定时器。
ExecStart定义要执行的任务(脚本文件) /root/mytimer.sh为绝对路径,/bin/bash降低出错概率。
3.编写一个定时器单元文件,命名(*.timer)boot_backup.timer,也保存在/etc/systemd/system目录中。内容如下:
[Unit]
Description=Time to Run xiaj.txt for 3s
[Timer]
AccuracySec=1us
OnUnitActiveSec=3s
Unit=/etc/systemd/system/boot_backup.service #.service路径
[Install]
WantedBy=multi-user.target
其中
OnUnitActiveSec = 3s 是每三秒运行一次。
AccuracySec = 1us 是提高精度
Unit = boot_backup.service 是关联启动
4..由于创建了新的单元文件,需执行命令重新加载systemd守护进程。
systemctl daemon-reload
5.执行systemctl命令,启动定时器
systemctl start boot_back.timer
6.查看运行情况
systemctl status boot_backup.timer
7.最后可通过tail 查看文件的末尾内容。
而tail -f是一个非常有用的选项,它允许你实时查看文件的更新内容,特别适用于那些不断追加内容的日志文件。
tail -f /tmp/mylog.txt
可以看到以每三秒记录着。
实时定时器
- 在单调定时器的基础上修改,修改定时器单元文件(*.timer)
这里设定为一分钟一次。
注意:在计时器单元文件中,通过在[Timer] 部分下添加“OnCalendar” 选项来指定您希望任务运行的时间。
例如:
要每天凌晨 2:30 运行该任务,您可以使用以下行:OnCalendar=*-*-* 02:30:00
每小时运行一次:OnCalendar=hourly
要每周一凌晨 2:30 运行它:OnCalendar=Mon *-*-* 02:30:00
每 6 小时运行一次:OnCalendar=*:0/6
每天上午 10 点和下午 6 点运行:OnCalendar=10:00,18:00
- 运行结果:
可以看到大致以一分钟记录一次
Crontab
- 准备shell脚本文件
编辑脚本
vi time.sh
#! /bin/bash
echo `date` >> /tmp/mylog.txt
- crontab编写内容
使用crontab -e打开crontab
开始编写定时任务
* * * * * /root/time.sh
#每分钟执行一次xia.sh,*从左往右分别是分钟(0-59)、小时(0-23)、天(1-31)、月(1-12)、星期(0-6),这里五个星表示每分钟执行一次
- 启动服务
systemctl start crond
- 运行状态
tail 查看日志写入
at
在Linux中通常使用at 在指定时间内调度一次性任务。
- 创建timer.sh文件
编写内容
#!/bin/bash
echo `date` >> /tmp/mylog.txt
- 执行at命令进入作业设置状态,添加任务
设置为在两分钟后执行一次
- 查看已添加的任务
atq
- 查看执行结果
tail -f /tmp/mylog.txt
至此结束,感谢您的阅读
小结
对于学习Linux的人来说,掌握Systemd定时任务具有重要意义,主要体现在以下几个方面:
实用性:定时任务是Linux系统管理中常见的需求,如定期备份、日志轮转、自动发送邮件等。使用Systemd定时任务,可以方便地设置和管理这些任务,提高系统维护的效率。
灵活性:Systemd定时任务提供了丰富的定时规则和时间单位,使得任务调度更加灵活和精确。无论是简单的每分钟执行一次任务,还是复杂的按周、按月执行特定任务,都可以轻松实现。
可靠性:Systemd作为Linux系统的初始化和管理工具,具有强大的稳定性和可靠性。使用Systemd定时任务,可以确保任务在指定的时间准确执行,减少因系统原因导致的任务失败。
集成性:Systemd将定时任务和服务管理紧密集成在一起,使得任务调度和服务启动更加便捷。通过编写服务单元文件和定时器单元文件,可以方便地定义任务和调度规则,实现任务的自动化管理。
学习价值:掌握Systemd定时任务有助于深入理解Linux系统的服务管理和进程调度机制。这对于学习Linux系统架构、提升系统管理技能以及进行更高级的系统编程都具有重要意义。