systemd定时器与cron周期定时

目录

前言

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博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值