目录
一次性计划任务
一次性计划任务只执行一次,一般用于满足临时的工作需求。
atd服务
使用at命令需要启用负责该任务的服务—atd
[root@localhost Desktop]# systemctl status atd.service # 查看atd服务的状态
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-07-14 20:00:38 CST; 3min 29s ago
Main PID: 1075 (atd)
CGroup: /system.slice/atd.service
└─1075 /usr/sbin/atd -f
Jul 14 20:00:38 192.168.75.137 systemd[1]: Started Job spooling tools.
[root@localhost Desktop]# systemctl is-enabled atd.service # 查看atd服务是否开机自启
enabled
安全性问题
使用at产生所要运作的工作,并将这个工作以文本文件的方式写入/var/spool/at/目录内,该工作便等待atd服务的取用与执行了。
[root@localhost at]# ll # 查看/var/spool/at/目录内文件
total 8
drwx------. 2 daemon daemon 6 Nov 20 2015 spool
[root@localhost at]# at 20:30 # 设定at计划
at> /usr/sbin/shutdown -r
at> <EOT>
job 2 at Wed Jul 14 20:30:00 2021
[root@localhost at]# ll # 新建at计划写入/var/spool/at/目录
total 16
-rwx------ 1 root root 4283 Jul 14 20:09 a00002019d94ae
drwx------. 2 daemon daemon 6 Nov 20 2015 spool
为了系统的安全,可以使用/etc/at.allow与/etc/at.deny这两个文件来进行at的使用限制。加上这两个文件后,at的工作情况如下:
- 寻找/etc/at.allow文件(管理较为严格的方式),只有写在这个文件中的使用者才可以使用at,没有在这个文件中的使用者不可以使用at(即使没有写在at.deny中);
- 如果/etc/at.allow不存在,就寻找 /etc/at.deny 这个文件(管理较为松散的方式),若写在这个 at.deny 的使用者则不能使用 at , 而没有在这个 at.deny 文件中的使用者,就可以使用 at ;
- 如果两个文件都不存在,则只有root可以使用at指令。
在一般的Linux发行版中,假设系统上的所有用户都是可信任的,因此系统通常会保留一个空的/etc/at.deny文件,这样允许所有人使用at指令。
[root@localhost ~]# find /etc -type f -name at.*
/etc/at.deny
[root@localhost ~]# cat /etc/at.deny
[root@localhost ~]#
at命令的使用
[root@localhost ~]# at 21:00 # 创建at计划任务
at> /usr/sbin/shutdown -r
at> <EOT> # 使用Ctrl+D结束编写计划任务
job 3 at Wed Jul 14 21:00:00 2021
[root@localhost ~]# echo "reboot" | at 20:30 # 使用管道符创建at计划任务
job 4 at Wed Jul 14 20:30:00 2021
[root@localhost ~]# atq # atq查看计划任务
3 Wed Jul 14 21:00:00 2021 a root
4 Wed Jul 14 20:30:00 2021 a root
[root@localhost ~]# at -l # at -l查看计划任务
3 Wed Jul 14 21:00:00 2021 a root
4 Wed Jul 14 20:30:00 2021 a root
[root@localhost ~]# atrm 3 # atrm删除计划任务
[root@localhost ~]# at -d 4 # at -d删除计划任务
[root@localhost ~]# atq
长期性计划任务
长期性计划任务可以周期性的、有规律的执行某些具体的任务,可以使用Linux系统中默认启用的cron服务。
crond服务
使用crontab命令需要启用负责该任务的服务—crond
[root@localhost ~]# systemctl status crond.service # 查看crond服务的状态
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-07-14 20:00:38 CST; 24min ago
Main PID: 1074 (crond)
CGroup: /system.slice/crond.service
└─1074 /usr/sbin/crond -n
Jul 14 20:00:38 192.168.75.137 systemd[1]: Started Command Scheduler.
Jul 14 20:00:38 192.168.75.137 crond[1074]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 51% if used.)
Jul 14 20:00:38 192.168.75.137 crond[1074]: (CRON) INFO (running with inotify support)
[root@localhost ~]# systemctl is-enabled crond.service # 查看crond服务是否开机自启
enabled
安全性问题
用户使用crontab命令建立计划任务后,该项任务就会被记录到/var/spool/cron/目录中,并以账号判别。
为了系统的安全性,可以如at相同限制使用crontab的用户:
- /etc/cron.allow:将可以使用crontab的账号写入其中,若不在这个文件中的使用者不可使用crontab;
- /etc/cron.deny:将不可以使用crontab账号的写入其中,若未记录在这个文件中的使用者则可以使用crontab。
/etc/cron.allow比/etc/cron.deny优先级更高,两个文件只能选择一个限制,系统默认保留/etc/cron.deny。
crontab命令使用
- 创建编辑计划任务:crontab -e
- 查看计划任务:crontab -l
- 删除计划任务:crontab -r
- 设置他人的计划任务:crontab -u
crond服务设置任务的参数格式:分时日月周!如果有些字段没有设置,则需要使用星号*占位。
注意:计划任务中的分字段必须有数值,绝不能为空或者是*号,日和星期字段不能同时使用,否则会产生冲突。
在以上各个字段中,还可以使用以下特殊字符:
- "*"代表所有的取值范围内的数字,如月份字段为*,则表示1到12个月;
- "/"代表每一定时间间隔的意思,如分钟字段为*/10,表示每10分钟执行1次。
- "-"代表从某个区间范围,是闭区间。如“2-5”表示“2,3,4,5”,小时字段中0-23/2表示在0~23点范围内每2个小时执行一次。
- ","分散的数字(不一定连续),如1,2,3,4,7,9。
crontab配置实例
[root@localhost ~]# crontab -e # 新建crontab计划任务
no crontab for root - using an empty one
crontab: installing new crontab
[root@localhost ~]# crontab -l # 查看crontab计划任务
30 9 * * * /usr/bin/tar -cvzf backup.tar.gz /etc/
[root@localhost ~]# cd /var/spool/cron/ # 进入/var/spool/cron/目录
[root@localhost cron]# ll # crontab任务被以用户名作为文件名记录到/var/spool/cron/目录中
total 4
-rw------- 1 root root 50 Jul 14 20:44 root
[root@localhost cron]# crontab -r # 删除crontab记录任务
[root@localhost cron]# ll
total 0
crontab注意点
- crontab有2种编辑方式:直接编辑/etc/crontab文件与crontab –e,其中/etc/crontab里的计划任务是系统中的计划任务,而用户的计划任务需要通过crontab –e来编辑;
- 每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。
- crontab中的command尽量使用绝对路径,否则会经常因为路径错误导致任务无法执行。
- 新创建的cron job不会马上执行,至少要等2分钟才能执行,可从起cron来立即执行。
- %在crontab文件中表示“换行”,因此假如脚本或命令含有%,需要使用%来进行转义。
系统级别计划任务
/etc/crontab
crontab -e是针对使用者的cron设计,crontab实际是/usr/bin/crontab这个执行文件。如果是系统级别的计划任务只需要编辑/etc/crontab这个文件即可(/etc/crontab是一个纯文本文件)。
Linux下cron服务的最低侦测限制是分钟,它会自动每分钟读取/etc/crontab与/var/spool/cron/中的内容。编辑/etc/crontab文件之后cron会自动执行(由于crontab是读取到内存中的,修改/etc/crontab后不会马上执行,这时候重启crond服务试试。)
[root@localhost Desktop]# ls /var/spool/cron/root 用户级cron工作
/var/spool/cron/root
[root@localhost Desktop]# cat /etc/crontab 系统级cron工作
SHELL=/bin/bash 使用的shell接口
PATH=/sbin:/bin:/usr/sbin:/usr/bin 执行文件搜寻路径
MAILTO=root 若有额外的STDOUT,将数据email给root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- 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
分 时 日 月 周 身份 命令
可唤醒停机期间的工作任务
anacron
anacron 的存在是为了处理非24小时一直启动的Linux系统的crontab的执行,以及因为某些原因导致错过时间而没有被执行的工作。
anacron每小时被crond执行一次,然后anacron再去检测相关的计划任务有没有被执行,若有超过期限的任务就执行该任务,执行完毕或无需执行任何任务,anacron停止。
anacron会以预设一天、七天、一个月为期去侦测系统未执行的crontab任务,anacron通过读取时间记录文件timestamps来分析现在的时间和时间记录文件所记载的上次执行anacron的时间,两者比较后若发现差异,则表示在某些时刻没有执行crontab,此时anacron会开始执行未进行的crontab任务。
1 5 cron.daily nice run-parts /etc/cron.daily 执行流程
- 由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天;
- 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳;
- 由上个步骤与目前的时间比较,若差异天数为 1 天以上 (含 1 天),就准备进行指令;
- 若准备进行指令,根据 /etc/anacrontab 的设定,将延迟 5 分钟 + 3 小时 (看 START_HOURS_RANGE 的 设定);
- 延迟时间过后,开始执行后续指令run-parts /etc/cron.daily;
- 执行完毕后, anacron 程序结束。
由此得知,有时系统开机后,后约 1 小时左右系统会有一小段时间的忙碌,硬盘会跑个不停,因为 anacron 正在执行过去 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 里头的未进行的各项工作排程。