Linux 计划任务(at、crontab、anacron)


一次性计划任务

atd
一次性计划任务只执行一次,一般用于满足临时的工作需求。

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

长期性计划任务

crond服务
长期性计划任务可以周期性的、有规律的执行某些具体的任务,可以使用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服务设置任务的参数格式:分时日月周!如果有些字段没有设置,则需要使用星号*占位。

注意:计划任务中的分字段必须有数值,绝不能为空或者是*号,日和星期字段不能同时使用,否则会产生冲突。
crontab
在以上各个字段中,还可以使用以下特殊字符:

  • "*"代表所有的取值范围内的数字,如月份字段为*,则表示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
  分 时 日 月 周  身份        命令

crond配置文件

可唤醒停机期间的工作任务

anacron

anacron 的存在是为了处理非24小时一直启动的Linux系统的crontab的执行,以及因为某些原因导致错过时间而没有被执行的工作。

anacron每小时被crond执行一次,然后anacron再去检测相关的计划任务有没有被执行,若有超过期限的任务就执行该任务,执行完毕或无需执行任何任务,anacron停止。

anacron会以预设一天、七天、一个月为期去侦测系统未执行的crontab任务,anacron通过读取时间记录文件timestamps来分析现在的时间和时间记录文件所记载的上次执行anacron的时间,两者比较后若发现差异,则表示在某些时刻没有执行crontab,此时anacron会开始执行未进行的crontab任务。
anacron
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/ 里头的未进行的各项工作排程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值