前言
在Linux系统中,定时任务扮演着至关重要的角色,它们允许用户在预定的时间自动执行特定的任务或命令。这些任务可以包括定期备份数据、发送邮件、分析日志等,从而极大地提高了系统的自动化程度和效率。在Linux中,有多种实现定时任务的方式,其中最为常见的是使用systemd、crontab以及at命令。
首先,systemd是一个强大的系统和服务管理器,它不仅能够管理系统进程和服务,还提供了定时任务的功能。通过创建以“.timer”结尾的文件,用户可以定义任务的执行时间和频率,systemd将负责在指定的时间触发这些任务。与cron相比,systemd定时任务具有更多的优点,例如可以设置CPU和内存的使用额度,限制任务对系统资源的消耗,同时支持任务的拆分和依赖管理,使得复杂的定时任务得以实现。
在使用systemd定时器时,用户需要创建一个服务单元文件(.service文件)并放置在/etc/systemd/system/目录下。该文件指定了定时任务的相关设置和命令。然后,用户可以使用systemctl命令来启动、停止、重启和管理这些服务。此外,systemd定时器还提供了丰富的日志功能,方便用户调试任务和查看任务调度情况。
其次,crontab是另一个在Linux中广泛使用的定时任务工具。它允许用户创建和管理计划任务,通过编辑crontab文件,用户可以定义任务的执行时间、要运行的命令或脚本等。crontab的优点在于其简单易用,且支持分钟、小时、日、月和星期等多种时间单位进行任务安排。然而,它对于系统资源的控制相对较弱,不如systemd灵活。
最后,at命令也是一种实现定时任务的方式。它允许用户从文件或标准输入中读取命令,并在未来的一个时间点执行这些命令。at命令的特点是只执行一次任务,非常适合于那些只需要在特定时间执行一次的任务。然而,它的使用相对有限,不如crontab和systemd广泛。
综上所述,Linux系统提供了多种实现定时任务的方式,每种方式都有其独特的优点和适用场景。用户可以根据具体需求选择合适的方式来实现定时任务,从而提高系统的自动化程度和效率。在实际应用中,这些定时任务工具可以相互补充,共同构建一个高效、稳定的Linux系统环境。
systemd定时服务
创建单调定时器
解释
单调定时器(Monotonic Timer)在Linux系统中是一个重要的计时机制,它主要用于测量经过的时间,而不是关心具体的日期或时间。与墙钟时间(Wall Clock Time)不同,单调定时器不受系统时间调整(如手动设置时间或NTP同步)的影响,因此它提供的时间测量更为稳定和可靠。
在Linux内核中,单调定时器通常基于高精度硬件时钟实现,以确保计时的准确性和稳定性。内核提供了相应的接口和函数,使得用户空间程序和内核模块都可以方便地使用单调定时器。
编写任务脚本文件
创建一个脚本,命名可自己随意,将date
写入临时目录/tmp中的.txt文件中
注意:此处为反引号
反引号(``)的主要作用是命令替换。具体来说,当反引号中的内容是一个命令时,shell会先执行该命令,并将命令的输出结果替换掉反引号中的内容。这提供了一种方便的方式,将命令的输出作为其他命令的输入或赋值给变量
#! /bin/bash
echo `date` >> /tmp/mylog.txt
授予脚本执行权限
执行脚本,查看日志
编写一个定时器单元文件
此处以脚本名字命名.service文件
内容如下:
[unit]
Description=Backup boot
[Service]
Type=simple
ExecStart=/bin/bash /root/mytimer.sh
解释:
.service
文件是 Linux 系统中 systemd 服务的配置文件,用于定义服务的启动、运行、停止等行为以及服务的依赖关系等。这些文件通常存放在
/etc/systemd/system/
或
/lib/systemd/system/
目录下。
.service
文件配置的内容通常包含三个主要部分:
[Unit]
、
[Service]
和
[Install]
。
- [Unit] 部分: - Description:服务的简短描述,用于在 systemctl 等工具中显示。- After 和 Before:定义服务的启动顺序,指定当前服务应该在哪些服务之后或之前启动。- Requires 和 Wants:定义服务之间的依赖关系。
Requires
表示强依赖,即如果依赖的服务没有运行,当前服务也无法启动。而Wants
表示弱依赖,即使依赖的服务没有运行,当前服务也可以启动。- Conflicts:定义冲突的服务,即如果此字段列出的服务已经启动,则当前服务无法启动。 - [Service] 部分: - Type:定义服务的启动类型,例如
simple
(直接启动指定的命令)、forking
(启动命令将在后台运行)等。- ExecStart:服务启动时执行的命令或脚本。- ExecStop:服务停止时执行的命令或脚本。- Restart:定义服务在退出时是否以及如何重新启动。- User 和 Group:以哪个用户和组的身份来运行服务。- WorkingDirectory:服务的工作目录。- EnvironmentFile:环境变量文件,可以在其中定义服务运行所需的环境变量。
编写一个配套的服务单元文件
此处以脚本名字命名.timer文件
内容如下:
[Unit]
Description=mytimer
[Timer]
OnUnitActiveSec=3s
AccuracySec=1us
Unit=mytimer.service
[Install]
WantedBy=multi-user.target
解释:
.timer
文件在 Linux systemd 系统中用于定义定时任务的配置。与
.service
文件不同,
.timer
文件不直接定义要执行的服务或命令,而是指定何时触发一个或多个
.service
文件。这使得
.timer
和
.service
可以组合在一起,以定义定时执行的服务。
一个基本的
.timer
文件配置内容主要包含以下部分:
[Unit]部分
- Description:定时器的简短描述,用于在 systemctl 等工具中显示。
[Service]部分
- OnBootSec、OnActiveSec、OnUnitActiveSec、OnCalendar:这些选项定义了何时激活定时器。例如,
OnCalendar
可以用于设置基于日历时间的触发条件,如每天、每周或特定日期的某个时间。 - Unit:指定当定时器触发时要激活的
.service
文件的名称。 - Persistent:如果设置为
true
,则即使服务启动后定时器到期,服务也会继续运行,直到它自行停止。 - AccuracySec:设置定时器触发时间的准确度,允许一些偏差以避免因精确的触发时间导致的系统负载。
[Install]部分
- WantedBy:定义此定时器文件被哪个或多个目标(target)所启用
移动文件位置
将文件mytimer.service 和文件mytimer.timer复制到/etc/systemd/system目录中
如果之前在/etc/systemd/system目录下写的mytimer.service和mytimer.timer文件,就不需再操作此步骤,但注意,脚本位于/root目录下
重新装载单元文件
由于创建的新的单元文件,需执行systemctl daemon-reload命令重新装载单元文件
systemctl daemon-reload
设置开机启动
systemctl enable mytimer.timer
systemctl enable mytimer.service
启动“mytime.timer”的”systemd”服务并查看状态
注意:此处要为active
systemctl start mytimer.timer
systemctl status mytimer.timer
启动“mytime.service”的”systemd”服务并查看状态
此处已正常启动
systemctl start mytimer.service
systemctl status mytimer.service
监视日志文件
这里可以重新开一个终端,查看日志文件,因为.timer文件中,[Timer]中以三秒时间输出,所以日志文件中应为间隔三秒
tail -f /tmp/mylog.txt
创建实时定时器
实时定时器(RTC,Real-Time Clock)是一个专用的计数器或定时器,主要用于提供日历信息,包括小时、分钟、秒、日、月份、年份以及星期。RTC不仅用于时间的显示,还在许多应用中发挥着关键作用
编写任务脚本
此处名字可随意
#!/bin/bash
time_str=$(date +"%T")
IFS=':' read -r hours minutes seconds <<< "$time_str"
total_seconds=$((hours + minutes + seconds))
echo `date` >> /tmp/mylog.txt
echo "时间小时分钟秒钟相加得:$total_seconds " >> /tmp/mylog.txt
解释:
这段bash脚本的主要目的是获取当前的时间(小时、分钟和秒),并将它们相加以得到一个总秒数。然后,它将当前日期和总秒数写入一个日志文件。下面是逐行的解释:
#!/bin/bash
- 这是一个shebang,告诉系统用哪个解释器来执行此脚本。在这里,它使用bash shell。time_str=$(date +"%T")
- 使用date
命令获取当前的时间,并仅返回小时、分钟和秒(格式如 "10:20:30")。然后将这个字符串赋值给变量time_str
。IFS=':' read -r hours minutes seconds <<< "$time_str"
-IFS
是Internal Field Separator的缩写,它是一个bash shell变量,用于定义字段的分隔符。在这里,它被设置为冒号(:),这样bash就知道如何分割time_str
变量中的时间字符串。-read
命令用于从输入中读取数据,并将读取的数据分配给变量。在这里,它读取time_str
中的小时、分钟和秒,并将它们分别赋值给hours
、minutes
和seconds
变量。-<<<
是一个here string,它允许你将一个字符串作为read
命令的输入。total_seconds=$((hours + minutes + seconds))
- 这里进行了一个简单的算术计算,将小时、分钟和秒的值加在一起。但是,请注意,这样做并不正确,因为小时和分钟应该转换为相应的秒数(例如,1小时=3600秒,1分钟=60秒)后再进行相加。所以,此处的计算方法是错误的。echo `date` >> /tmp/mylog.txt
- 使用date
命令获取当前的日期和时间,并使用echo
命令将其追加到/tmp/mylog.txt
文件中。echo "时间小时分钟秒钟相加得:$total_seconds " >> /tmp/mylog.txt
- 使用echo
命令将计算得到的总秒数(虽然计算方法是错误的)和一段文本一起追加到/tmp/mylog.txt
文件中。
授予脚本权限
chmod +x 666.sh
编写一个定时器单元文件
[Unit]
Description=My Timer
[Timer]
OnCalendar=*:0/1
AccuracySec=1us
Unit=666.service
Persistent=true
[Install]
WantedBy=multi-user.target
解释:
这是一个 systemd 的
.timer
配置文件,用于设置定时任务。以下是对每一部分的详细解释:
[Unit]部分
Description=My Timer
这一行定义了该定时器的描述,即“My Timer”。这个描述信息会在使用如
systemctl
等命令查看定时器状态时显示。
[Timer]部分
OnCalendar=*:0/1
这一行定义了定时器的触发条件。这里,
*:0/1
表示每分钟的每一秒都会触发。具体来说:
*
表示每小时的每一分钟。0/1
表示从第0秒开始,每1秒触发一次。
因此,这个定时器将会每秒触发一次。
AccuracySec=1us
这一行设置了定时器触发的准确度。
1us
表示触发时间的准确度为1微秒。然而,在实际系统中,由于系统负载和调度等原因,定时器可能不会如此精确地按照设定时间触发。通常,这个值被设置得相对较大,以避免因追求精确触发时间而给系统带来过大的负担。
Unit=666.service
这一行指定了当定时器触发时应该启动的
.service
文件。在这个例子中,当定时器触发时,它将启动名为
666.service
的服务。
Persistent=true
这一行表示如果定时器触发时对应的服务已经开始运行,那么即使定时器到期,服务也会继续运行,直到它自行停止。
[Install]部分
WantedBy=multi-user.target
这一行定义了该定时器应该被哪个 target 所启用。在这个例子中,当系统进入
multi-user.target
运行级别时,这个定时器会被启用。
multi-user.target
是一个通用的运行级别,表示系统进入了多用户模式,但没有启动图形界面。
编写一个配套的服务单元文件
[Unit]
Description=My Service
[Service]
ExecStart=/bin/bash /etc/systemd/system/666.sh
[Install]
WantedBy=multi-user.target
解释:
这是一个 systemd 的
.service
配置文件,用于定义一个系统服务。以下是对每一部分的详细解释:
[Unit]部分
Description=My Service
这一行定义了服务的描述,即“My Service”。这个描述信息会在使用如
systemctl
等命令查看服务状态时显示。
[Service]部分
ExecStart=/bin/bash /etc/systemd/system/666.sh
这一行定义了服务启动时应该执行的命令。在这个例子中,当服务启动时,它会使用
/bin/bash
来执行
/etc/systemd/system/666.sh
这个脚本。这意味着
666.sh
脚本应该包含服务需要执行的所有操作。
[Install]部分
WantedBy=multi-user.target
这一行定义了该服务应该被哪个 target 所启用。在这个例子中,当系统进入
multi-user.target
运行级别时,这个服务会被启用。
multi-user.target
是一个通用的运行级别,表示系统进入了多用户模式,但没有启动图形界面。
重新装载单元文件
systemctl daemon-reload
开机自启,并启动定时器
systemctl enable 666.timer
systemctl start 666.timer
查看日志
可重新开一个终端,进入/tmp目录中,查看日志
此处的小时以24小时制,例:此处为两点,但在时间相加时,以14点
14+50=64
Crontab
Crontab是一个在Unix和类Unix操作系统中用于设置周期性被执行指令的工具。它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。
Crontab命令从标准输入设备读取指令,并将其存放于“crontab”文件中以供之后读取和执行。这些计划任务条目定义了任务的执行时间和要运行的命令或脚本,可以按照分钟、小时、日、月和星期等不同的时间单位进行安排。
Crontab文件中的每一行代表一个定时任务,格式如下:分钟 小时 日 月 星期 命令。每个字段都有特定的取值范围,例如分钟和小时字段可以是从0到59和0到23之间的任何整数,日期字段可以是从1到31之间的任何整数,月份字段可以是从1到12之间的任何整数,星期字段可以是从0到7之间的任何整数(其中0或7都表示星期日),命令字段则是要执行的命令或脚本的完整路径。
创建crontab定时器
编写shell脚本
#! /bin/bash
echo "tao is a beautiful gril" >> /tmp/qy.txt
编写定时任务
打开crontab编写定时任务,crontab -e
注:
crontab
是 Unix、Linux 和类 Unix 系统中的一个命令,用于设置周期性被执行的任务。
crontab
文件中的每一行都代表一项任务,其格式如下:
* * * * * command-to-be-executed
- - - - -
| | | | |
| | | | +---- Day of the week (0 - 7) [Both 0 and 7 represent Sunday]
| | | +------ Month (1 - 12)
| | +-------- Day of the month (1 - 31)
| +---------- Hour (0 - 23)
+------------ Minute (0 - 59)
查看定时任务
启动服务并查看状态
systemctl start cron
systemctl status cron
查看日志
注意:此处为一分钟输出一次
tail -f /tmp/qy.txt
如果没有qy.txt文件,touch /tmp/qy.txt创建文件即可
touch /tmp/qy.txt
at
AT命令是一种在Unix和类Unix操作系统中用于提交作业以在稍后的时间点运行的工具。通过AT命令,用户可以设定在未来某个特定时间执行一次性的任务或命令。
AT命令的实现方式是通过将命令字符串发送到系统,系统经过解析后,在指定的时间执行相应的操作。用户可以通过AT命令来安排诸如文件备份、系统维护、数据收集等一次性任务,而无需手动干预。
使用AT命令时,用户需要指定任务的执行时间,并输入要执行的命令或脚本。系统会将该任务添加到作业队列中,并在指定的时间自动执行。需要注意的是,AT命令只执行一次任务,不会重复执行。
此外,AT命令还提供了一些参数和选项,用于控制任务的执行方式和行为。例如,用户可以通过参数设置任务的优先级、指定任务的输出文件等。
at示例
一分钟后将在线用户写道user.txt文件中
at> who >> user.txt #此处CTRL+D退出
查看
输出时间到指定位置
查看
结束语
systemd定时任务作为systemd服务管理框架的一部分,为我们提供了强大且灵活的定时任务管理功能。它与服务管理紧密集成,使得我们可以方便地启动、停止或重启服务,同时安排一次性或周期性的任务。这种集成性使得systemd定时任务在复杂的系统环境中尤为出色。
而crontab作为Linux系统中传统的定时任务工具,凭借其简单易用的特点,一直深受用户喜爱。通过编辑用户的crontab文件,我们可以轻松地定义定时任务,并在指定的时间执行相应的命令或脚本。无论是日常的系统维护任务还是周期性的数据备份,crontab都能满足我们的需求。
此外,at命令为我们提供了一种简单快捷的方式来安排一次性的定时任务。它不需要编辑文件,而是直接在命令行中定义任务和时间,非常适合临时或一次性的需求。当我们需要快速安排一个任务在特定时间执行时,at命令无疑是一个理想的选择。
总的来说,Linux系统为我们提供了丰富多样的定时任务管理工具,使得我们可以根据具体的需求和场景选择适合的方式来设置定时任务。无论是需要周期性执行的服务管理任务,还是一次性的临时任务,我们都能在这些工具中找到合适的解决方案。通过合理利用这些工具,我们可以更加高效地管理Linux系统,提升工作效率。
版权归原作者 Linux-palpitate 所有, 如有侵权,请联系我们删除。