Linux创建systemd定时器代替cron

目录 

一、定时器简介

二、与cron的区别

三、创建systemd定时器

创建单调定时器

四、总结


一、定时器简介

1.systemd定时器

systemd定时器是systemd中的一个组件,允许用户定义和配置定时任务,并在设定的时间点或时间间隔触发执行。这些定时任务可以包括脚本、命令、服务或其他系统任务的执行。定时器单元文件通常以 .timer 后缀结尾,存储在 /etc/systemd/system 目录或者 /usr/lib/systemd/system 目录下。

从触发时间的角度,systemd定时器可以分为两种类型:单调定时器和实时定时器。单调定时器从一个特定的时间(如系统启动或systemd服务单元执行的开始时间)开始后,经过一段时间触发。而实时定时器则是在某个特定的时钟时间触发,类似于cron定时任务。

使用systemd定时器,可以方便地设置定时任务,如每小时发送一封电子邮件,或者在每周日的晚上12点清理日志文件等。此外,systemd定时器还提供了自动生成日志的功能,便于除错。还可以设置内存和CPU的使用额度,以控制任务执行时的资源消耗。同时,systemd定时器也支持任务的拆分和依赖其他Systemd单元,以实现更复杂的任务调度。

2.crontab定时器

crontab是一个用于在Unix/Linux系统上设置周期性执行任务的命令。它允许用户创建、编辑、查看和删除定时执行的任务列表。这些任务通常以脚本或命令的形式存在,可以是系统管理、数据备份、日志清理等各种自动化任务。

语法:

crontab [-u 用户名] 文件
crontab [-u 用户名] [-l | -r | -e | -i]

参数:

-u 用户名:指定要操作的用户,如果不指定,则默认操作当前用户的crontab。
-l:列出指定用户的当前定时任务列表。
-r:移除指定用户的所有定时任务。
-e:编辑指定用户的定时任务列表。
-i:在删除用户的crontab文件时进行确认。

crontab使用一种特定的格式来定义任务执行的时间,对于每分钟执行一次的任务,你需要使用以下的时间字段:

 
对于每分钟执行一次的任务,你需要将分钟字段设置为*(代表每分钟),其他字段保持为*以代表任意值。下面是一个例子,展示了如何设置一个每分钟执行一次的crontab条目:
1.打开crontab编辑器:
bash复制代码

 

 crontab -e 


2.在打开的编辑器中,添加以下行来定义你的任务(假设你的命令是/path/to/your/script.sh):
bash复制代码

 

 * * * * * /path/to/your/script.sh 


保存并关闭文件。
3.现在,你的脚本/path/to/your/script.sh将会每分钟执行一次。确保你的脚本具有执行权限:
bash复制代码

 

 chmod +x /path/to/your/script.sh 


如果你的脚本需要特定的环境变量或者是在特定的用户下运行,你可能需要在脚本的开头设置这些环境变量,或者使用sudo(如果必要的话)。
请注意,crontab任务默认不会输出任何内容到终端。如果你需要查看任务的输出或错误,你可能需要将输出重定向到一个文件,例如:

* * * * * /path/to/your/script.sh >> /path/to/logfile.log 2>&1 


这将会把标准输出(stdout)和标准错误(stderr)都追加到/path/to/logfile.log文件中。

3.at定时器

at是一个用于在Unix/Linux系统上设置一次性或定时执行任务的命令。与crontab不同,at命令是用于一次性或特定时间执行任务,而不是周期性执行。

以下是at命令的简单介绍:

1.语法:

at [-V] [-q 队列] [-f 文件] [-mldbv] 时间选项 时间

2.参数:

-V:显示at命令的版本信息。
-q:指定任务提交到的队列,默认为a队列。
-f:指定包含要执行命令的文件。
-m:发送邮件通知用户任务执行完成。
-l:显示待执行的任务列表。
-d:删除指定的待执行任务。
-b:显示当前队列的状态。
-v:显示详细信息,包括任务的执行时间和任务ID。

 3.时间选项: 

HH:MM:指定具体的时分,24小时制。
now:立即执行任务。
noon:中午12点。
midnight:午夜12点。

4.示例:

在10分钟后执行命令:at now + 10 minutes
在明天下午3点执行命令:at 3pm tomorrow
从文件中读取命令并在指定时间执行:at -f script.sh 2:00 PM
列出所有待执行的任务:at -l
删除指定任务:at -d 123456789(其中123456789为任务的ID)

 at命令通常用于需要在未来某个特定时间执行的任务,如备份数据、定期任务等。它提供了一种简单而有效的方式来安排和管理一次性任务的执行。

二、systemd与cron的区别

  1. 集成性与依赖性:
    • systemd定时器是systemd系统和服务管理器的一部分,因此它紧密集成在Linux系统中。这意味着systemd定时器可以与其他systemd单元(如服务、套接字、挂载点等)进行交互和依赖管理。这使得在复杂的系统环境中,systemd定时器可以更容易地与其他服务集成和协同工作。
    • cron则是一个独立的工具,它并不依赖于systemd。cron的定时任务通常在系统的cron守护进程(如crond)下运行,与其他系统服务的交互较为有限。
  2. 配置与管理:
    • systemd定时器的配置文件通常使用.timer扩展名,并存储在systemd的系统或服务单元目录中。这些配置文件使用INI文件格式,易于阅读和维护。此外,systemd提供了丰富的工具和命令,用于管理、启动、停止和查询定时器状态。
    • cron的配置文件通常位于/etc/crontab或/etc/cron.d/目录下,并且使用特定的cron语法来定义定时任务。虽然cron的语法相对简单,但对于复杂的任务调度和依赖关系,其配置可能会变得相对繁琐。
  3. 功能与灵活性:
    • systemd定时器提供了更丰富的功能和更高的灵活性。除了基本的定时任务调度,systemd定时器还支持依赖管理、资源控制(如CPU和内存限制)、定时器持久化(即使系统重启也能保持定时器的状态)等特性。此外,systemd定时器还支持日历事件和时间范围等高级调度功能。
    • cron主要提供基本的定时任务调度功能,通过简单的时间表达式来定义任务的执行时间。虽然cron可以满足许多常见的定时任务需求,但对于更复杂的任务调度和依赖关系,其能力相对有限。
  4. 日志与调试:
    • systemd定时器与systemd的日志系统紧密集成,可以方便地查看和管理定时任务的日志。这使得在调试和排查问题时更加容易追踪和定位问题所在。
    • cron的日志通常存储在系统的syslog或cron守护进程的日志文件中,虽然可以通过查看这些日志文件来获取任务执行的信息,但相对于systemd定时器来说,其日志管理和查看可能不如systemd定时器直观和方便。

传统的cron工具虽然能够实现定时任务,但在功能和使用上相对较为局限。相比之下,systemd定时器具有更高的灵活性和更丰富的定时规则。它可以设置精确的时间触发,如每天的特定时刻、每周的特定天和时间,甚至是每隔一段时间触发。此外,systemd定时器还支持在系统启动时立即触发任务,以及在指定的时间间隔内循环执行任务。

同时,systemd定时器还具有资源限制的功能,可以对定时任务做资源限制,避免任务过度消耗系统资源。另外,它还可以与journal日志集成,方便调试任务并查看任务调度情况。

(以上由ai生成)

三、创建systemd定时器

要使用systemd的定时器,关键是要创建一个定时器但源文件和一个配套的服务单元文件,然后启动这些单元文件

创建单调定时器

首先执行以下命令临时改变 SELinux 的状态(如果不能执行那就是权限不够)

setenforce 0

编写任务脚本文件,这里是一个简单的引导区备份脚本,在/usr/local/bin目录下编写(这里将date日志放在root目录下)

vim /usr/local/bin/boot_backup
#! /usr/bin/bash

echo `date` >> /root/syslog.txt

给命令授予执行权限,执行以下命令

 chmod +x /usr/local/bin/boot_backup

编写一个配套的服务单元文件,将其命名为boot_backup.service,保存在/etc/systemd/system目录下           (这里将Type值设置为simple(默认值)。如果设置为oneshot,该单元服务文件仅执行一次之后会退出,系统会关掉定时器。)

vim /etc/systemd/system/boot_backup.service
Description=Backup boot

[Service]
Type=simple
ExecStart=/usr/local/bin/boot_backup

编写一个定时器单元文件,将其命名为boot_backup.timer,保存在/etc/systemd/system目录下

 vim /etc/systemd/system/boot_backup.timer
[Unit]
Description=Run boot backup weekly and on boot

[Timer]
OnBootSec=1h
OnUnitActiveSec=3s

[Install]
WantedBy=multi-user.target

由于创建的新的单元文件,需要对单元文件重载

systemctl daemon-reload

执行开机启动(启动的是.timer文件,而不是.service文件。因为配套的service文件有timer文件启动。

 systemctl enable boot_backup.timer

启动定时器

systemctl start  boot_backup.timer

查看运行状态(绿色表示已启动)

systemctl status boot_backup.timer

可执行以下命令列出定时器

systemctl list-timers

查看日志文件

tail -f syslog.txt

四、总结

      systemd定时器是Linux系统中一个强大而灵活的定时任务管理工具,它允许用户定义和配置定时任务,并在设定的时间点或时间间隔触发执行。与传统的cron定时器相比,systemd定时器具有更多的功能和灵活性。

Linux系统中,`cron`是一个定时任务调度器,它允许用户以固定的时间间隔执行任务。这些任务被称作`cron jobs`,通常保存在`crontab`文件中。`cron`服务运行在后台,按照预定的时间自动执行这些脚本或命令。 使用`cron`来增加定时任务的基本步骤如下: 1. 打开终端。 2. 输入`crontab -e`命令来编辑`cron`的任务列表。如果还没有任务,则会创建一个新的`crontab`文件。 3. 在打开的编辑器中,你可以在文件的末尾添加一行来定义你的定时任务。每一行的格式通常如下: ``` * * * * * /path/to/command arg1 arg2 ``` 这里的五个星号分别代表: - 分钟(0-59) - 小时(0-23) - 一个月中的日期(1-31) - 月份(1-12) - 一周中的天(0-7,其中0和7都代表星期天) 如果需要让任务每天都执行,可以写成: ``` 0 0 * * * /path/to/command ``` 这表示在每天的午夜执行`/path/to/command`。 4. 保存并退出编辑器。更改将自动应用,`cron`会根据新的`crontab`文件开始调度任务。 5. 你可以使用`crontab -l`命令来列出当前用户的`cron`任务,以确认你的任务是否已经被正确添加。 6. 如果需要删除某个`cron`任务,可以使用`crontab -r`命令来删除当前用户的全部`cron`任务。要删除特定的任务,需要先编辑`crontab`文件,并删除对应的行。 7. 确保`cron`服务正在运行。可以使用如下命令来检查状态(以`systemd`为例): ``` systemctl status cron ``` 如果服务没有启动,你可以使用如下命令来启动: ``` systemctl start cron ``` 并且设置为开机启动: ``` systemctl enable cron ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值