概述
Systemd定时器是一个功能强大的任务调度工具,它提供了比传统cron更高级的功能,分单调定时器和实时定时器两种。具体来说,Systemd定时器具有以下特点:
- 灵活性:Systemd定时器可以在系统启动后的某个时间点运行脚本,或者根据systemd启动时间、上次定时器启动时间来设置任务执行的时间点。
- 高级功能:与cron相比,Systemd定时器不仅可以在固定的、重复的具体日期和时间触发任务,还可以配置为在其他systemd单元状态发生变化时触发任务。
- 使用场景:Systemd定时器可以应用于多种场景,例如在特定的系统事件后执行任务,或者在一段时间过去之后执行一次性任务等。
- 易于管理:Systemd定时器作为Systemd的一部分,可以使用systemctl命令进行管理,这使得任务的启用、禁用、启动、停止等操作变得简单直观。
- 集成性:由于Systemd定时器紧密集成在Systemd体系中,它能够很好地与其他systemd组件如服务(services)和目标(targets)协同工作。
- 教程资源:有关Systemd定时器的设置和使用,网络上有许多教程和例子可以参考,这些资源可以帮助用户更好地理解和上手Systemd定时器的使用。
总的来说,Systemd定时器是一个强大的定时任务工具,它不仅提供了传统的定时任务功能,还增加了许多高级特性,使得它在现代Linux系统中成为了一个非常有用的组件。
计划任务有两类:一类是周期性执行,一类是一次性执行。
计划任务分为:系统的计划任务和用户自定义的计划任务。
通过命令创建的一般为用户任务,通过配置文件定义的则为系统级任务
计划任务(Scheduled Tasks)是计算机操作系统中的一种功能,它允许用户预设在特定的时间点或周期性地执行某些任务或命令。这些任务可以是任何类型,比如运行脚本、备份文件、发送邮件、更新系统、检查网站状态等。通过计划任务,用户可以自动化一些重复性或周期性的工作,从而节省时间,提高效率。
在Linux系统中,计划任务管理通常通过cron服务来实现。Cron是一个在Unix、BSD、Linux和类Unix操作系统中的时间基础的作业调度程序,它允许用户设置周期性重复被执行的计划任务。用户可以通过编辑crontab文件来定义计划任务的执行时间和执行命令,cron服务每分钟都检查/etc/crontab 文件etc/cron.d目录和/var/spooIcron目录中的变化。一旦crontab文件被保存,cron守护进程(daemon)会根据其中的设置,在指定的时间点自动执行相应的任务。/var/spool/cron 目录下的任务需要通过crontab-e 命令来创建,存放在cron.d目录下的是任务配置文件,而不是可执行文件。
除了cron服务外,Linux系统还提供了其他工具来辅助计划任务管理。例如,at
命令用于设置一次性计划任务,它允许用户在指定的时间点执行单个任务。另外,anacron
服务则是cron服务的补充,用于在系统关机后执行未完成的计划任务,确保重要的任务不会因系统重启而遗漏。默认anacron每小时由cron执行一次,检测相关的调度任务有没有被执行的程序。
计划任务的好处在于它们可以自动化执行繁琐或重复性的任务,减少了人工干预的需要。这不仅可以提高工作效率,还可以减少人为错误的风险。此外,通过计划任务,用户可以确保在特定的时间点执行某些关键任务,比如定期备份数据、检查系统健康状态等,从而保障系统的稳定性和安全性。
计划任务的特点主要体现在以下几个方面:
-
自动化执行:计划任务的核心特性是自动化执行。一旦设置了计划任务,系统就会在预定的时间或满足特定的条件时自动执行相应的任务,无需人工干预。这大大减轻了用户的工作负担,提高了工作效率。
-
定时性:计划任务可以设定在特定的时间点执行,比如每天的某个时间、每周的某一天、每月的某一天等。这种定时性使得用户可以精确地控制任务的执行时间,确保任务在需要的时候被执行。
-
周期性:除了定时性,计划任务还可以设置为周期性执行,如每隔一段时间执行一次。这种周期性执行的特点使得计划任务非常适合用于需要重复执行的任务,如定期备份数据、更新系统等。
-
灵活性:计划任务支持多种类型的任务,可以执行脚本、命令、程序等。用户可以根据自己的需求,定义任何类型的任务作为计划任务,这使得计划任务具有非常高的灵活性。
-
可靠性:一旦计划任务被正确设置,系统就会按照预定的时间和条件执行任务,不会因为人为的疏忽或遗忘而导致任务未能执行。这种可靠性使得计划任务成为保障系统稳定性和数据安全性的重要手段。
-
可管理性:Linux系统提供了丰富的工具和命令来管理计划任务,如
crontab
命令用于编辑和管理cron计划任务,at
命令用于设置一次性计划任务等。这些工具使得用户可以方便地查看、编辑、删除或暂停计划任务,提供了良好的可管理性。 -
资源占用低:计划任务在执行时通常不会占用太多的系统资源,尤其是当任务处于等待状态时,几乎不会消耗任何资源。这使得计划任务可以在不影响系统性能的情况下运行。
总之,计划任务是操作系统中一个非常实用的功能,它使得用户可以预设并自动化执行各种任务,提高了工作效率和系统的可靠性。在Linux系统中,用户可以利用cron服务和其他相关工具来轻松管理计划任务。
创建单调定时器
创建Shell脚本
执行命令创建syslog.sh脚本
vim syslog.sh
添加脚本内容
#!/bin/bash
echo `date` >> /root/syslog.txt #执行date将输出结果追加到/root/syslog.txt
对Shell脚本增加可执行权限
chmod +x syslog.sh
创建的Shell脚本如果不赋予可执行权限,后面的定时器启动时系统无法执行该脚本,会导致定时任务无法正常进行
创建脚本中所需文本syslog.txt
touch syslog.txt
编写配套服务单元
进入/etc/systemd/system(建议步骤)
cd /etc/systemd/system
创建systemd定时器时,如果不将其放置在
/etc/systemd/system
目录下,可能会影响其管理和启用。具体来说,可能会有以下影响:
- 管理不便:通常,系统服务和管理脚本都存放在
/etc/systemd/system
目录下,以便于统一管理。如果定时器不在这个目录下,可能会导致管理员在查找和管理时出现不便。- 启用困难:Systemd单元(包括服务、目标和定时器)通常需要放置在标准的目录中,如
/etc/systemd/system
,才能被Systemd自动识别和加载。如果定时器不在标准目录下,可能需要手动加载或使用systemctl enable
命令来启用它,这增加了管理的复杂性。- 权限问题:
/etc/systemd/system
目录通常有特定的权限设置,确保只有root用户或特权用户能够修改其中的文件。如果定时器放置在其他目录,可能需要调整文件权限,以确保Systemd能够正常读取和执行定时器文件。
创建一个名为syslog.service的文件
vim syslog.service
在syslog.service文件中,添加以下内容来定义服务的配置:
[Unit]
Description=date daemon
[Service]
Type=simple
ExecStart=/root/syslog.sh #可执行文件的路径
编写定时器单元文件
编写一个名为syslog.timer的文件
vim syslog.timer
在syslog.timer文件中,添加以下内容来定义服务的配置:
[Unit]
Description=Run syslog ever second
[Timer]
OnUnitActiveSec=3s #表示在关联的单元被激活后等待3秒后再次运行服务。
AccuracySec=1ms #表示实际触发时间与设定时间之间的最大允许偏差1ms。
[Install]
WantedBy=multi-user.target
systemd定时器不够精确,因此需要“AccuracySec=1ms”来确保任务尽可能接近预定的执行时间被触发。如果没有设置
AccuracySec
,systemd将使用默认的时间精度,这可能会导致更大的时间偏差或无法执行任务
SELinux的安全策略设置
查看SELinux当前的运行状态
getenforce
- Enforcing:表示SELinux的安全策略正在被强制执行。
- Permissive:表示SELinux的安全策略正在执行,但不会强制执行,也就是说,策略违规的行为会被记录,但不会阻止行为的发生。
- Disabled:表示SELinux功能已被禁用
结果为Enforcing时,执行下列命令,其他则不用使用
setenforce 0 #禁用SELinux强制访问控制策略。
在某些情况下,SELinux的策略可能会与某些服务或应用程序的配置冲突,导致它们无法正常工作。当发生这种情况时,可以通过将setenforce设置为0来禁用SELinux的强制访问控制策略,以允许服务或应用程序正常运行。
重新装载单元文件
systemctl daemon-reload
在对文件做出修改后需要执行systemctl daemon-reload进行重新装载单元文件,不然在会在启动定时器及服务时报错
启动定时器
systemctl enable syslog.timer #设置开机自启
systemctl start syslog.timer #启动定时器
若是不重要的任务可以不设置开机自启
查看定时器状态
systemctl status syslog.timer
结果为绿色的active时表示定时器成功启动
查看服务运行状态结果
运行结果显示每3秒输出一次时间,与定时器每3秒执行一次任务相符合,极少数情况下会出现4秒一次也属于正常现象
创建实时定时器
实时定时器适合按照日历时间的计划任务管理,这里也以一个定期备份任务为例,要求 每周执行一次(如时间为周日2点),且上次未执行就立即执行。实现步骤与上述单调定时器 一样,只是将定时器单元文件修改即可。其内容符合实时定时器,修改如下:
[Unit]
Description=Run syslog ever weekly
[Timer]
OnCalender=sun,02:00
Persistent=true
[Install]
WantedBy=multi-user.target
使用cron安排周期性任务
使用配置文件/etc/crontab定义系统级周期性任务(任务调度)
配置文件/etc/crontab,添加任务
每行代表一个任务,其格式如下:
在 crontab 文件中,注释是以 #
开头的行,它们不会被系统执行,而是用来提供关于 crontab 文件内容的信息或说明。
下面具体解释一 下各字段的含义。
前5个字段用于表示计划时间,数字取值范围:分钟(0~59),小时(0~23).日期(1~31),月份(1~12),星期(0~7,0或7代表星期日)。 尤其要注意以下几个特殊符号的用途:星号“*”为通配符,表示取值范围中的任意值;连字符“-“表示数值区间;逗号”:“用于多个数值列表;正斜线“/”用来指定间隔频率。 在某范围后面加上”/整数值“ 表示在 该范围内每跳过该整数值执行一次任务。例如”*/3“或者“1-12/3”用在“月份”字段表示每3个月,“*/5”或者“0-59/5”用在“分钟”字段表示每5分钟
第6个字段表示执行任务命令的用户身份,例如root。
最后一个字段就是要执行的命令。
Linux系统中预设有许多例行任务,cron服务默认开机自动启动。通常cron服务的监测周期是1分钟,它每分钟会读取配置文件/etc/crontab的内容,根据其中的定义执行任务。
SHELL=/bin/bash #默认shell环境
PATH=/sbin:/bin:/usr/sbin:/usr/bin #执行命令的默认路径
MAILTO=root #执行结果以邮件形式发送到此处指定的用户
# For details see man 4 crontabs #用户如果想要了解关于 crontab 的更多细节,可以查看
手册页(man page)的第 4 部分
# Example of job definition: #接下来会给出一个 crontab 任务定义的示例
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed #定义任务调度
#分钟(m) 小时(h) 日期(dom)月份(mon)星期(dow)用户身份(user)要执行的命令(command)
例如,如果你想在每三个月的星期一的凌晨1点执行一个脚本/root/a.sh
,你可以添加以下行
0 1 * */3 1 /root/a.sh
保存并退出编辑器
在vi
编辑器中,按Esc
,然后输入:wq
并按Enter
保存并退出。在nano
编辑器中,按Ctrl + O
保存,然后按Ctrl + X
退出。
确保脚本/root/a.sh
具有执行权限。你可以使用chmod
命令来设置权限:
chmod +x /root/a.sh
确保cron服务正在运行
确保cron
服务正在运行,以便它可以按计划执行任务。你可以使用以下命令来检查服务的状态:
systemctl status crond
结果为绿色的active时表计划任务成功启动
如果服务没有运行,你可以使用以下命令启动它:
systemctl start crond
并且,如果你想让它在系统启动时自动运行,可以使用:
systemctl enable crond
查看cron日志
要查看由cron执行的任务的日志,可以查看/var/log/syslog
(在Debian/Ubuntu系统上)或/var/log/cron
(在某些其他系统上)。你也可以使用grep
来过滤日志:
grep CRON /var/log/cron
注意事项
- 确保脚本或命令具有适当的执行权限。
- 如果脚本或命令需要特定的环境变量或路径,确保在脚本中正确地设置了它们,或者通过
cron
的PATH
环境变量来定义。 - 尽量避免在
cron
作业中输出大量日志到标准输出或错误输出,因为这可能会填满系统日志或邮件队列。 - 如果脚本需要运行很长时间,或者需要消耗大量资源,请确保系统有足够的资源来处理这些任务,避免影响其他正在运行的服务。
在/etc/cron.d目录中定义个别的周期性任务
/etc/crontab配置文件适合全局性的计划任务,如果要定制更为灵活、更具个性的计划住务,则可以考虑在/etc/cron.d/目录中+添加自己的配置文件,格式/etc/crontab,文件名可以自定义。
例如添加一个文件backup用于执行备份任务,内容如下:
#每月第1天4:10AM执行自定义脚本
10 4 1 * root /scripts/backup.sh
对于需要定期执行的软件,可以在此使用一个新的cron配置文件。
使用crontab命令为普通用户定制任务调度
上述两种配置是系统级的,只有root用户能够通过/etc/crontab 文件和/etc/cron.d目录来定制cron任务调度。普通用户只能使crontab命令创建和维护自己的cron配置文件。读命令的基本用法为:
crontab [-u 用户名][-e|-l|-r]
选项-u指定要定义任务调度的用户名,没有此选项则为当前用户; -e用于编辑用户的cron调度文件:-l用于显示cron调度文件的内容;-e用于删除用户的cron调度文件。没有列入etc/cron.deny文件中的Linux用户可以直接执行命令cronitab -e进入vi的编辑界面,每行定义一个任务调度,格式与/etc/crontab类似,只是少一个用户身份字段,编辑完成后输入:wgb保存并退出。crontab命令生成的cron调度文件位于/var/spoolcron目录,以用户账户名命名。例如,执行以下命令,系统将打开文本编辑器定义任务调度,任务调度文件保存为/va/spool/cron/zhong:
crontab -u zhong -e
使用at工具安排一次性任务
(1)在命令行中执行at命令进入作业设置状态。at后面跟时间参数,即要执行任务的时间
●MMDDYY、MM/DD/YY或MM.DD.YY:日期格式,表示某年某月某天的当前时刻。
月日年英文格式:如January 15 2015,年份可选。
特定时间:midnight代表12:00AM; noon 代表12:00 PM; teatim1e f代表4:00 PM.
●now+:从现在开始多少时间以后执行,单位是minues hors days 或 weeks. 如 now
+3 days代表命令应该在3天之后的当前时刻执行。
(2)出现at提示符,进入命令编辑状态,设置要执行的命令或脚本。可指定多条命令,
每输入一条命令,按<Enter>建。
(3)需要结束时按<Ctrl >+<D>组合键退出。
(4)可根据需要执行命令atq查看等待运行(未执行)的作业。
(5)如果需要取消at作业,可以在atrm命令后跟atq命令输出的作业号,将该作业删除
at
是一个在 Unix 和 Linux 系统上用来安排一次性任务的工具。你可以使用 at
命令来指定一个任务在将来的某个时间执行。以下是使用 at
工具安排一次性任务的基本步骤:
-
确保
atd
服务正在运行: -
在大多数系统上,
at
命令需要atd
服务来运行。首先,检查这个服务是否正在运行:systemctl status atd
-
如果服务没有运行,你可以使用以下命令来启动它:
systemctl start atd
并且,如果你希望它在系统启动时自动运行,可以使用:
systemctl enable atd
-
使用
at
命令安排任务:
使用 at
命令时,它会提示你输入要执行的命令。你可以直接输入命令,或者使用文本重定向来指定一个包含命令的文件。
-
例如,要安排一个任务在明天上午 10 点执行,你可以这样做:
echo "echo 'Hello, World!' > /tmp/helloworld.txt" | at 10:00 tomorrow
这条命令会在明天上午 10 点执行
echo 'Hello, World!' > /tmp/helloworld.txt
,将字符串 "Hello, World!" 写入/tmp/helloworld.txt
文件中。 例如,您使用at now + 10minutes
来安排一个任务,该任务将在10分钟后执行。在at>
提示符下,您输入了ps
和ls
命令。这些命令将在指定的时间执行,您使用atq
命令来查看队列中未执行的at作业,并正确地看到了作业编号 1 和它的执行时间您使。用atrm
命令来删除at作业,如果作业已经被成功删除,atq
命令将不会返回任何输出。 -
[root@localhost ~]# at now + 10minutes #指定作业任务 at> ps at> ls at> <EOT> at> <EOT> job 1 at Fri Apr 19 02:33:00 2024 #查询未执行at作业 [root@localhost ~]# atq 1 Fri Apr 19 02:33:00 2024 a root #删除at作业 [root@localhost ~]# atrm 1 [root@localhost ~]# atq
-
查看
at
队列: -
你可以使用atq
命令来查看当前用户的at
任务队列:atq
-
删除
at
任务: -
如果你需要取消某个at
任务,可以使用atrm
命令并指定任务的编号。任务编号可以从atq
命令的输出中找到。atm 任务编码
-
注意事项:
at
命令通常需要用户具有特定的权限才能使用,通常是at
组的成员。你可以使用sudo
或者将用户添加到at
组来获取这些权限。- 一些系统出于安全考虑可能禁用了
at
命令。在这种情况下,你需要检查系统的安全策略或联系系统管理员。 - 任务执行时的环境可能与你当前的环境不同,因此确保你的命令在独立环境中也能正确运行。