Linux计划任务之at和cron

时间:2021-04-16 14:19:59

at命令用于在指定时间执行命令,一次性命令。

at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm(小时:分钟)式的时间指定。

假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。

用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。

上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。

指定格式为:now + count time-units,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。

 

启动atd:

systemd start atd  启动

systemd enable atd  开机自启

systemd status atd   查看状态


语法
选项
-f:指定包含具体指令的任务文件;
-q:指定新任务的队列名称;
-l:显示待执行任务的列表,相当于atq
-d:删除指定的待执行任务,相当于atrm

-r:删除系统中的at任务列表,相当于atrm

-c:列出后续at任务的具体指令内容

-m:任务执行完成后向用户发送E-mail。

在设置at任务后,会在/var/spool/at目录生成at任务计划的文件,执行顺序文件名按数字或字母的排序进行


参数

日期时间:指定任务执行的日期时间。

【可以使用绝对时间,也使用相对时间

绝对时间:at 10:00 ls /tmp

相对时间:at now+5minutes ls /tmp】

例子:

1、在明天十点钟执行任务

root@debian:~#
root@debian:~# at 10:00 tomorrow
warning: commands will be executed using /bin/sh
at> ls /etc/passwd > /home/guest/passwd_10
at> <EOT>
job 11 at Fri Apr 27 10:00:00 2018
root@debian:~# date
Thu Apr 26 05:21:12 EDT 2018
root@debian:~#

2、在5天后的上午5点执行任务

root@debian:~# at 5am+5days
warning: commands will be executed using /bin/sh
at> ls /etc/passwd > /home/guest/passwd_5
at> ls /etc/group > /home/guest/group_5
at> <EOT>
job 10 at Tue May  1 05:00:00 2018
root@debian:~#
root@debian:~# date
Thu Apr 26 05:18:51 EDT 2018
root@debian:~#

 

计划任务设定后,在没有执行之前我们可以用atq (q:queue 队列)命令来查看系统没有执行工作任务:

root@debian:~# atq
8       Thu Apr 26 10:00:00 2018 a root
9       Fri Apr 27 10:00:00 2018 a root
11      Fri Apr 27 10:00:00 2018 a root
6       Thu Apr 26 10:00:00 2018 a root
10      Tue May  1 05:00:00 2018 a root
root@debian:~#

 

删除任务:atrm number

root@debian:~# atq
8       Thu Apr 26 10:00:00 2018 a root
9       Fri Apr 27 10:00:00 2018 a root
11      Fri Apr 27 10:00:00 2018 a root
6       Thu Apr 26 10:00:00 2018 a root
10      Tue May  1 05:00:00 2018 a root
root@debian:~#
root@debian:~# atrm 11
root@debian:~# atq
8       Thu Apr 26 10:00:00 2018 a root
9       Fri Apr 27 10:00:00 2018 a root
6       Thu Apr 26 10:00:00 2018 a root
10      Tue May  1 05:00:00 2018 a root
root@debian:~#

 

查看已经设置的任务内容: at -c number  (number为队列号)

如: at -c 8   

Linux计划任务之at和cronLinux计划任务之at和cron
m4a=00\;36:\*.mid=00\;36:\*.midi=00\;36:\*.mka=00\;36:\*.mp3=00\;36:\*.mpc=00\;3   6:\*.ogg=00\;36:\*.ra=00\;36:\*.wav=00\;36:\*.oga=00\;36:\*.opus=00\;36:\*.spx=0   0\;36:\*.xspf=00\;36:; export LS_COLORS
SSH_CONNECTION=192.168.9.132\ 65170\ 192.168.9.119\ 22; export SSH_CONNECTION
LANG=en_US.UTF-8; export LANG
OLDPWD=/lib/modules/4.9.0-6-686-pae; export OLDPWD
XDG_SESSION_ID=3; export XDG_SESSION_ID
USER=root; export USER
PWD=/root; export PWD
HOME=/root; export HOME
SSH_CLIENT=192.168.9.132\ 65170\ 22; export SSH_CLIENT
SSH_TTY=/dev/pts/0; export SSH_TTY
MAIL=/var/mail/root; export MAIL
SHLVL=2; export SHLVL
LOGNAME=root; export LOGNAME
XDG_RUNTIME_DIR=/run/user/1000; export XDG_RUNTIME_DIR
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH
cd /root || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
cat /etc/passwd > /tmp/passwd_file

root@debian:~# at -c 8 > /tmp/at_queue_8
root@debian:~#
root@debian:~#
root@debian:~# clear
root@debian:~# less /tmp/at_queue_8
01\;35:\*.m4v=01\;35:\*.mp4v=01\;35:\*.vob=01\;35:\*.qt=01\;35:\*.nuv=01\;35:\*.wmv=01\;35:\*.asf=01\;35:\*.rm=01\;35:\*.rmvb=01\;35:\*.flc=01\;35:\*.avi=01\;35:\*.fli=01\;35:\*.flv=01\;35:\*.gl=01\;35:\*.dl=01\;35:\*.xcf=01\;35:\*.xwd=01\;35:\*.yuv=01\;35:\*.cgm=01\;35:\*.emf=01\;35:\*.ogv=01\;35:\*.ogx=01\;35:\*.aac=00\;36:\*.au=00\;36:\*.flac=00\;36:\*.m4a=00\;36:\*.mid=00\;36:\*.midi=00\;36:\*.mka=00\;36:\*.mp3=00\;36:\*.mpc=00\;36:\*.ogg=00\;36:\*.ra=00\;36:\*.wav=00\;36:\*.oga=00\;36:\*.opus=00\;36:\*.spx=00\;36:\*.xspf=00\;36:; export LS_COLORS
SSH_CONNECTION=192.168.9.132\ 65170\ 192.168.9.119\ 22; export SSH_CONNECTION
LANG=en_US.UTF-8; export LANG
OLDPWD=/lib/modules/4.9.0-6-686-pae; export OLDPWD
XDG_SESSION_ID=3; export XDG_SESSION_ID
USER=root; export USER
PWD=/root; export PWD
HOME=/root; export HOME
SSH_CLIENT=192.168.9.132\ 65170\ 22; export SSH_CLIENT
SSH_TTY=/dev/pts/0; export SSH_TTY
MAIL=/var/mail/root; export MAIL
SHLVL=2; export SHLVL
LOGNAME=root; export LOGNAME
XDG_RUNTIME_DIR=/run/user/1000; export XDG_RUNTIME_DIR
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH
cd /root || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
cat /etc/passwd > /tmp/passwd_file
View Code

 

允许和拒绝用户使用at命令的两个文件:/etc/at.allow 和 /etc/at.deny:

/etc/at.allow 和 /etc/at.deny :

/etc/at.allow:at任务计划的白名单,仅允许此文件中的用户执行at

/etc/at.deny:at任务计划的黑名单,仅拒绝此文件中的用户执行at

系统先查找/etc/at.allow ,然后再去查找/etc/at.deny ,如果两个文件都没有,只有root用户执行at

 

---------------------------------------------------------------------------------------------

cron命令用于在循环执行命令,周期性命令。

 

Linux系统则是由cron(crond)这个系统服务来控制的。Linux系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另外,由于使用者自己也可以设置计划任务,所以,Linux系统也提供了使用者控制计划任务的命令:crontab 命令。

 

一:crond简介

crond是Linux下用来周期性的执行某种任务或等待处理某些事情的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否由要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

 

cron相关配置文件:

/etc/crontab:cron配置文件

/etc/cron.d/:cron辅助配置文件

/var/spool/cron:用户cron任务计划的配置文件,用户设置完cron任务后,会在/var/spool/cron目录下生成以用户名名称的cron文件

/etc/crontab文件:设置/查看/删除等cron任务计划,执行结果以邮件方式发送给任务发起者:

[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=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

[root@localhost ~]#

 /etc/crontab 文件解析:前三行是用来配置crond任务运行的环境变量,第一行SHELL变量指定系统使用哪个shell,第二行PATH变量指定系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给谁,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户。最后几行对计划任务的格式进行详细的介绍。

crontab用法:

选项:

-e:编辑cron任务内容

-u:为指定用户设置cron任务计划(只有root用户能够使用)

-l:查看cron任务列表

-r:删除所有的cron列表

 

  时间的特殊写法:

通配符*:代表任意时间

【实例:10 12 * * * ls /tmp

意思是:每天12点10分执行ls /tmp命令】

 

离散时间段,(逗号):

【实例:5,10,15,40 10 * * * ls /tmp

意思是:每天10点5分、10分、15分和40分钟时 执行ls /tmp命令】

 

连续时间段-(中横线):

【实例:00 22 * * 1-5 ls /tmp

意思是:每周一到周五的22点执行ls /tmp

也可以这样写:

00 22 * * 1,2,3,4,5 ls /tmp 】

 

间隔时间段 */n:每个n就执行一次

【实例一:*/5 * * * * ls /tmp

意思是:每隔5分钟就执行一次 ls /tmp

实例二:00 10 */5 * * ls /tmp

意思是:每隔5天,在10点就执行一次 ls /tmp   ----注意:主要设置具体时间点】

----------------------------------

用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用crontab工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名和用户名一致。

 

使用者权限文件:

/etc/cron.deny:该文件中所列用户不允许使用crontab命令,默认情况下系统只保留该文件

/etc/cron.allow:该文件中所列用户允许使用crontab命令

/var/spool/cron:所有用户crontab文件存放的目录,以用户名命名

 

crontab文件含义:

系统任务调度:minute hour day month week user command

用户任务调度:minute hour day month week command

区别在于:系统任务调度可以指定用户指定,而用户任务调度只能该用户执行