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
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
允许和拒绝用户使用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
区别在于:系统任务调度可以指定用户指定,而用户任务调度只能该用户执行