systemd定时器与cron周期定时

2 篇文章 0 订阅
1 篇文章 0 订阅

目录

前言

systemd管理器

systemd定时器

corn周期定时器

at定时器

一,systemd定时器

1、systemd定时器单元文件单元文件

.timer文件

.service文件

2、创建systemd单调定时器

(1)编写一个任务脚本

(2)编写一个服务单元文件

(3)编写一个定时器单元文件

(4)重新装载文件

(5)执行命令让计时器开机启动,并启动它

(6)启动定时器服务,再次查看定时器服务状态,并检查日志

3、创建systemd实时定时器

二、corn周期定时

1、定义系统级周期服务定时器

2、使用crontab命令创建普通用户定制任务调度


前言

systemd管理器

systemd 是一个系统和服务管理器,设计用于 Linux 系统。它作为一种替代传统的 SystemV init 系统,提供了更强大和高级的初始化和系统管理功能。

systemd 主要有以下特点:

1. 并行启动:与传统的 SystemV init 系统相比,systemd 可以并行启动系统服务,提高系统的启动速度和性能。

2. 单元管理:systemd 使用单元(unit)的概念来管理系统资源和服务。这些单元包括服务单元、挂载单元、定时器单元等,每种类型的单元都有对应的配置文件,使得管理和配置更加灵活和方便。

3. 轻量化:systemd 的进程是相对较小和轻量的,而且采用 C 语言编写,因此占用系统资源相对较少。

4. 高级日志功能:systemd 集成了日志管理功能,可以用于查看系统日志,支持日志过滤与监控等功能。

5. 提供了自动化和可编程接口:systemd 提供了一系列的命令行工具和接口,可以用于启动和管理系统服务,还提供了高级的编程接口,如 D-Bus 接口,使得系统管理更加灵活和可扩展。

systemd 是一个功能强大且灵活的系统管理工具,可以帮助用户更好地管理系统和服务,并提高系统的可靠性和性能。

systemd定时器

systemd定时器是一个用于管理和触发系统任务的工具,它是systemd服务管理器的一部分。定时器可以用来定期执行一些任务,如备份数据、清理日志等。

定时器和对应的任务单元通常是一起定义和配置的。定时器单位定义了任务应该何时执行,而任务单元定义了要执行的任务具体是什么。

定时器可以配置为在某个特定时间点触发任务,也可以配置为在某个时间间隔内定期触发任务。定时器还支持一些高级功能,如激活任务单元的次数限制、延迟触发等。

通过systemd定时器,可以简化系统的任务调度和管理,提高系统的可靠性和稳定性。

systemd定时器又分为单调定时器和实时定时器区别如下:

系统单调定时器是基于系统时钟来计算时间的定时器,它保证定时器时间单调递增,但不能保证绝对准确。通常用于一般的定时功能,如延迟执行任务或定时轮询。

系统实时定时器则是使用硬件定时器来精确计时,可以提供更精确的定时器功能。实时定时器则常用于需要精确时间控制的应用,如实时数据采集、音视频同步等。

corn周期定时器

Cron定时器是一种经常用于调度任务的时间管理工具。它基于cron表达式来指定任务执行的时间规则,cron表达式可以描述任务在什么时候执行、每天、每周、每月的哪一天、哪一时刻执行。具体来说,cron表达式由5个或6个时间域组成,分别代表分钟、小时、日期、月份、星期几。

Cron定时器非常灵活,可以满足各种复杂的任务调度需求。例如,可以设置每周某一天的某个时间点执行任务,或者每隔一段时间执行一次任务等。常见的任务调度工具和框架如Quartz、Spring Task都支持cron表达式来设置任务执行时间。

Cron定时器是一种强大的时间调度工具,能够帮助开发者轻松地管理任务的执行时间。

at定时器

at定时器是一个强大的工具,它允许您设置定时任务并在预定的时间执行某些操作。AT定时器基于Bash shell,并且提供了许多有用的功能,使其成为一种强大的定时任务调度工具。sQ

(1)在命令行中执行at命令进入作业设置状态。at后面跟时间参数,即要执行任务的时可以是下面格式中任何一种。

·HH:MM:某一时刻,如05:00代表5:00AM。如果时间已过,就会在第2天的这一时间执行。

·MMDDYY、MM/DD/YY或MM.DD.YY:日期格式,表示某年某月某天的当前时刻

月日年英文格式:如January 152015,年份可选。

·特定时间:midnight 代表12:00AM;noon 代表12:00 PM;teatime代表4:00PM.

now+:从现在开始多少时间以后执行,单位是minutes、hours、days 或weeks.如 m%

+3 days代表命令应该在3天之后的当前时刻执行。

(2)出现a提示符,进入命令编辑状态,设置要执行的命令或脚本。可指定多条命令.

(3)需要结束时按<Ctrl>+<D>组合键退出。

(4)可根据需要执行命令atq查看等待运行(未执行)的作业。

(5)如果需要取消 at 作业,可以在atrm命令后跟atq命令输出的作业号,将该a作业删除。

年输入一条命令,按<Enter>键。

一,systemd定时器

1、systemd定时器单元文件单元文件

.timer文件

systemd 定时单元文件用于定义和配置systemd定时器。该文件通常以“.timer”为后缀,并包含定时器单元的配置信息和属性。用于指定 systemd 定时器的触发规则和设置。

通过编辑 `.timer` 文件,可以定制系统中的定时任务,例如定期执行备份、日志清理、定时重启等任务。系统会根据配置的触发规则自动执行这些任务,提高系统的自动化管理效率。

一个典型的systemd定时器单元文件(.timer文件)包含以下几个关键字段:

  1.  [Unit]:该字段定义了定时器单元的基本信息,如定时器单元的名称、描述和依赖关系。
  2. [Timer]:该字段用于配置定时器的设置,如定时器的触发时间和间隔、延迟时间、是否启用随机延迟等。常用的配置项包括OnActiveSec、OnBootSec、OnCalendar、OnUnitActiveSec等。
  • OnActiveSec:当服务单元进入活动状态时触发。活动状态通常表示服务已经启动并且正在运行。可以使用秒(s)、毫秒(ms)、微秒(us)或格式化的时间间隔表示。
  • OnBootSec:当系统引导时触发。该触发器指示服务单元在系统引导时启动。可以使用秒(s)、毫秒(ms)、微秒(us)或格式化的时间间隔表示。
  • OnCalendar:按照日历时间表触发。可以使用具体的时间和日期来配置触发器。例如,OnCalendar=–* 00:00:00指示服务在每天午夜触发。
  • OnUnitActiveSec:当服务单元进入活动状态并且保持活动状态指定的时间后触发。可以使用秒(s)、毫秒(ms)、微秒(us)或格式化的时间间隔表示。
  • Persistent:指定定时器是否持久化,如果设置为true,则即使计算机在定时器触发时处于休眠或关机状态,也会在下次启动时触发。

        3. [Install]:指定定时器的自动启用和禁用规则。常用的配置项包括WantedBy和Also。

在定时器单元文件中,可以配置多个定时器触发的规则,如具体的日期时间、时间间隔等。定时器单元文件也支持一些高级功能,如配置定时器触发任务的次数限制、关联触发多个任务等。

通过编辑定时器单元文件,用户可以灵活地定制系统任务的定时执行规则,实现数据备份、报告生成、定期维护等功能。同时,systemd定时器单元文件的配置结构清晰,易于理解和修改,使得系统管理更加简单和高效。

.service文件

.service 文件是 与.timer文件配套的服务文件,用于定义和配置系统服务。这些文件通常以 .service为扩展名,用于指定 systemd 服务的配置和行为。

一个典型的 .service 文件包含以下字段:

        1. [Unit]:在此部分中,可以指定服务单元的名称、描述、依赖关系和其他信息。

  • Description:服务的描述信息。
  • Requires:定义服务单元的依赖关系。
  • After:定义服务单元启动的顺序。
  • Before:定义服务单元停止的顺序。

        2. [Service]:这个部分用于配置服务的执行参数,如指定服务的命令、工作目录、启动类型、环境变量、执行权限等。

  • Type:指定服务的类型,如 simple、exec、forking、oneshot 等。
  • ExecStart:指定服务启动时执行的命令。
  • ExecStop:指定服务停止时执行的命令。
  • WorkingDirectory:指定服务的工作目录。
  • User、Group:指定服务运行的用户和组。
  • Restart:定义服务重启的策略。
  • Environment:指定服务运行时的环境变量。
  • TimeoutStartSec、TimeoutStopSec:指定服务启动和停止的超时时间。

        3. [Install]:在这个部分,可以指定服务单元的安装位置和依赖关系。

  • WantedBy:指定系统的目标(target),服务安装后将被启用的目标。

通过编辑 .service 文件,可以定义系统中运行的各种服务的行为和配置。例如,可以指定服务启动时的执行命令、运行用户、时间限制、资源限制等。系统会根据这些配置启动和管理相应的服务,以确保服务的正确运行和管理。

2、创建systemd单调定时器

(1)编写一个任务脚本

在此处编写一个记入系统时间的脚本system_time

先编写一个文件用于写入时间

touch syslog.txt

编写system_time脚本

vim system_time

输入i进入编写模式,输入如下代码,保存

赋予脚本可执行权限

chmod +x system_time

(2)编写一个服务单元文件

创建.service文件(注意:要保存在/etc/systemd/system目录中):

systemd单元文件在目录中的优先级按照以下顺序决定:

1. /etc/systemd/system/: 这个目录存放着系统管理员创建的单元文件,优先级最高,会覆盖其他目录中的同名单元文件。

2. /run/systemd/system/: 这个目录存放着运行时创建的单元文件,会覆盖/usr/lib/systemd/system/和/lib/systemd/system/中的同名单元文件。

3. /lib/systemd/system/: 这个目录存放着发行版提供的单元文件,通常不应该被修改。如果要修改这些单元文件,可以将其拷贝到/etc/systemd/system/目录中进行修改。

4. /usr/lib/systemd/system/: 这个目录也存放着发行版提供的单元文件,也不应该被修改。如果要修改这些单元文件,也可以将其拷贝到/etc/systemd/system/目录中进行修改。

vim /etc/systemd/system/system_time.service

写入如下内容:

[Unit]
Description=Recording system time

[Service]
Type=simple                    #此处将Type设置为simple,如果为oneshot则只执行一次便退出
ExecStart=/root/system_time        #可执行文件的路径

(3)编写一个定时器单元文件

创建.timer文件(注意:要保存在/etc/systemd/system目录中):

vim /etc/systemd/system/system_time.timer

写入如下内容:

[Unit]
Description=Time the system_time

[Timer]
OnBootSec=3s            #设置开机启动3s后运行
OnUnitActiveSec=3s      #设置定时
AccuracySec=1ms         #设置时间精度

[Install]
WantedBy=multi-user.target

(4)重新装载文件

命令:

systemctl daemon-reload

查看定时器,命令:

systemctl list-timers

可以看出定时器已经装载

(5)执行命令让计时器开机启动,并启动它

命令:

systemctl enable system_time.timer      #设置开机自启
systemctl start system_time.timer       #启动定时器

查看,timer服务是否启动:

systemctl status system_time.timer   #查看.timer单元文件是否运行

可以看出.timer单元文件已成功运行

查看,service服务是否启动:

systemctl status system_time.service   #查看.service单元文件是否运行

从图中可以看出.service单元文件是没有运行的

此时启动不了可以执行命令:

getenforce 	#用于查看当前系统的 SELinux 工作模式

补充:
在SELinux中,有三种工作模式:enforcing(执行模式)、permissive(宽容模式)、disabled(禁用模式)

可以从图中看出当前系统的工作模式为enforcing模式

可以执行命令:

setenforce 0  临时关闭

如果想永久关闭我们可以修改文件输入命令:

vim /etc/selinux/config

将SELINUX=enforcing改为SELINUX=disabled,然后保存退出

(6)启动定时器服务,再次查看定时器服务状态,并检查日志

输入命令:

systemctl start system_time.timer       #启动定时器
systemctl status system_time.timer   #查看.timer单元文件是否运行
​
systemctl status system_time.service   #查看.service单元文件是否运行

​

查看日志,命令:

cat /root/syslog.txt

可以看出定时器服务已经每隔3s运行了起来

3、创建systemd实时定时器

创建systemd实时定时器的操作与上述相同,只需更改.timer配置就行

[Unit]
Description=Time the system_time

[Timer]
OnCalendar=sun,06:00
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar是systemd中的一个配置项,用于指定定时器的触发时间。它接受一个日期和时间范围,表示定时器将在指定的日期和时间范围内触发。OnCalendar的值可以是以下之一:

* *:表示任意时间
* 具体的时间和日期,如"08:00"或"2023-07-19"
* *-*-* 指定一个月中的任意一天的任意时间,如"*-*-*"

在上面的示例中,定时器被配置为在每周日的6点触发,这是一个通用的时间段描述符,它意味着定时器将在指定的一个周中周日触发。通过使用OnCalendar配置项,我们可以根据不同的日期和时间范围设置不同的定时器触发条件。

二、corn周期定时

cron用来管理周期性重复执行的作业任务调度,非常适合日常系统维护工作。计划任务分为系统的计划任务用户自定义的计划任务。cron 服务每分钟都检查/etc/crontab 文件、/etc/cron.d 目录和/var/spool/cron 目录中的变化。如果发现改变,就将其载入内存。这样一来,更改 cron 任务调度配置后,就不必重新启动 cron 服务。/var/spool/cron 目录下的任务需要通过 crontab -e 命令来创建,存放在 cron.d 目录下的是任务配置文件,而不是可执行文件。通过命令创建的一般为用户任务,通过配置文件定义的则为系统级任务。

1、定义系统级周期服务定时器

corn主要通过配置文件/etc/crontab来定义系统级的周期性任务调度。默认配置文件内容如下

1. SHELL=/bin/bash:指定shell类型,这里通常使用bash或sh。
2. PATH=/usr/bin:/bin:指定环境变量PATH,它包含了可执行文件的搜索路径。
3. USER:指定cron作业的用户,通常为root用户。
4. COMMAND:指定要执行的命令或脚本。这可以是任何有效的shell命令或脚本。

除了这些基本行,/etc/crontab文件还可能包含以下行:

5. MAILTO:指定当cron作业成功执行时发送邮件的地址。
6. COMMENT:注释行,用于提供关于该作业的额外信息。
7. RUN_USER:指定在执行作业时使用的用户。如果设置为root用户,则作业将在root用户下执行。

在/etc/crontab文件中,每个作业行都遵循特定的格式,包括一个或多个字段,每个字段表示一个时间参数。这些时间参数包括分钟(0-59)、小时(0-23)、日期(1-31)、月份(1-12)和星期几(0-7,其中0和7都表示星期日)。字段之间用空格分隔,字段的值可以是数字或特殊字符(如*或/)。

现在通过定义系统级周期服务定时器来调用上节定义创建的脚本,使其按周期执行

配置/etc/crontab文件定义系统级周期性任务

将以下代码写入/etc/crontab文件中

55 19 * * * root /root/system.time

代码解释:

-55表示每小时的55分

-19表示每天的19时

以上代码表root用户,在每月每周每天的19时55分执行在/root目录下的system.time脚本

同样可以通过查看日志来确保定时任务已配置,日志如上文systemd配置的日志syslog.txt

命令:

cat /root/syslog.txt

2、使用crontab命令创建普通用户定制任务调度

如果是普通用户,可以通过使用crontab命令来创建和维护cron配置文件

语法:

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

参数介绍:

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

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

打开crontab编辑界面:

 crontab -e 

在打开的编辑器中,添加以下行来定义你的任务,格式与上文定义的/etc/crontab类似:

55 19 * * * root /root/system.time

现在,你的脚本将会每分钟执行一次。确保你的脚本具有执行权限

同样可以通过查看日志来确保定时任务已配置

3、使用at命令创建一次性任务调度

1.使用at命令安排一个任务,在一分钟后执行一个简单的shell命令:

echo "echo 'Hello World'" | at now + 1minute

查看atq命令查看执行任务

2.使用at命令定时执行一个shell脚本,该脚本的作用批量创建普通用户

先创建一个需要文件来批量存储要创建的用户名

vim /root/users.txt

这里我们输出四个用户为例zhangsan,lisi,wangwu,laoliu,就是我们要批量创建的对象

再接着创建创建用户的shell脚本,脚本名为useradd.sh

vim /root/useradd.sh

#/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST

do
        #create user if not exists
        id $UNAME >& /dev/null
        if [ $? -ne 0 ];then
                useradd $UNAME
                echo "已创建用户$UNAME"
                echo "123456" | passwd --stdin $UNAME
                echo "`date`创建用户$UNAME" >> /root/syslog.txt

        else
                #若已存在用户就更新密码
                echo "123456" | passwd --stdin $UNAME
                echo "`date`已存在用户$UNAME" >> /root/syslog.txt

        fi

done

赋予执行权限

chmod +x /root/useradd.sh
 

然后创建日志保存用户创建的时间

touch /root/syslog.txt

最后使用以下命令安排任务

at now + 1minute < /root/useradd.sh

验证结果

看1分钟之后是否执行成功

日志显示已创建用户,也就是说明脚本定时执行了

参考红帽之光:自动启动的systemd定时任务指南-CSDN博客

  • 53
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值