计划任务的方式:
例行性
突发性
linux如何实现这两个功能:
at:at是处理仅执行一次就结束的命令,必须要有atd服务的支持。
crontab:可循环执行,需要crond服务支持。
仅执行一次的计划任务
1.atd启动与at运行的方式
systemctl restart atd #重新启动atd服务
systemctl enable atd #让这个服务开机就自动启动
systemctl status atd #查看atd目前的状态
at运行方式:使用at命令产生任务,并将任务以文本形式写入/var/spool/at目录内,该任务便可等待atd服务的使用与执行了。
利用/etc/at.allow与/etc/at.deny这两个文件实现对at的管控:
先找/etc/at.allow这个文件,在里面的用户才能用at,没有则不行(即便没在at.deny中);如果/etc/at.allow不存在,查找/etc/at.deny,在里面的不能用at,没在就可以用;如果两个都不存在,就仅有root可以用at。
2.实际运行单一计划任务
at语法:
at [-mldv] TIME
-m:当at任务完成后,即便没有输出信息,也发email通知使用者任务已完成。
-l:at -l 相当于atq,列出目前系统的所有该使用者的at计划。
-d:at -d 相当于atrm,可以取消一个在at中的任务。
-v:用较明显的时间格式列出at计划中的任务列表。
-c:列出后面接的该项任务的实际命令内容。
TIME:时间格式,man at
查看
[root@study ~]# at now + 5 minutes <==单位要加 s 喔!
at> /bin/mail -s "testing at job" root < /root/.bashrc
at> <EOT> <==这里输入 [ctrl] + d 就会出现 <EOF> !代表结束!
job 2 at Thu Jul 30 19:35:00 2015
注意:建议使用绝对路径执行命令,如上面的/root/.bashrc
at的一个很棒的优点:后台执行。执行了at的任务后就可以脱机了,剩下的工作交给linux管理。
at任务的管理:
atq
查询主机的at计划任务
atrm [jobnumber]
删除任务
batch:系统有空时才执行后台任务
有空:在cpu的任务负载小于0.8时才执行你的工作任务
范例:执行pi的计算,然后在系统闲置时,执行updatedb的任务
[root@study ~]# echo "scale=100000; 4*a(1)" | bc -lq &
[root@study ~]# echo "scale=100000; 4*a(1)" | bc -lq &
[root@study ~]# echo "scale=100000; 4*a(1)" | bc -lq &
[root@study ~]# echo "scale=100000; 4*a(1)" | bc -lq &
# 然后等待大约数十秒的时间,之后再來确认一下工作负载的情況!
[root@study ~]# uptime
19:56:45 up 2 days, 19:54, 2 users, load average: 3.93, 2.23, 0.96
[root@study ~]# batch
at> /usr/bin/updatedb
at> <EOT>
job 4 at Thu Jul 30 19:57:00 2015
[root@study ~]# date;atq
Thu Jul 30 19:57:47 CST 2015
4 Thu Jul 30 19:57:00 2015 b root
# 可以看得到,明明时间已经超过了,却沒有实际执行 at 的任务!
[root@study ~]# jobs
[1] Running echo "scale=100000; 4*a(1)" | bc -lq &
[2] Running echo "scale=100000; 4*a(1)" | bc -lq &
[3]- Running echo "scale=100000; 4*a(1)" | bc -lq &
[4]+ Running echo "scale=100000; 4*a(1)" | bc -lq &
[root@study ~]# kill -9 %1 %2 %3 %4
# 这时先用 jobs 找出背景工作,再使用 kill 刪除掉四个背景工作后,慢慢等待工作负载的下降
[root@study ~]# uptime; atq
20:01:33 up 2 days, 19:59, 2 users, load average: 0.89, 2.29, 1.40
4 Thu Jul 30 19:57:00 2015 b root
[root@study ~]# uptime; atq
20:02:52 up 2 days, 20:01, 2 users, load average: 0.23, 1.75, 1.28
# 在 19:59 时,由于 loading 还是高于 0.8,因此 atq 可以看得到 at job 还是持续在等待当中!
# 但是到了 20:01 時, loading 降低到 0.8 以下了,所以 atq 就执行完毕了!
循环执行的计划任务
1.用户的设置
跟at一样,可用/etv/cron.allow与/etc/cron.deny这两个文件限制使用crontab命令的用户账号。
crontab运行方式:使用crontab命令建立任务后,该项任务会被记录到/var/spool/cron/中,而且以账号为判断依据。
crontab语法:
crontab [-u username] [-l|-e|-r]
-u:只有root能执行这个任务,即帮其他使用者建立/删除crontab计划任务。
-e:编辑crontab的任务内容。
-l:查看crontab的任务内容。
-r:删除所有的crontab任务,若要删除一项,可以用-e去编辑。
范例:用 dmtsai 的身份在每天的 12:00 发信給自己
[dmtsai@study ~]$ crontab -e
# 此时会进入vi的编辑界面!注意到,每项工作都是一行。
0 12 * * * mail -s "at 12:00" dmtsai < /home/dmtsai/.bashrc
#分 时 日 月 周 |<==============命令串========================>|
上面六个字段的意义:
代表意义 | 分钟 | 小时 | 日期 | 月份 | 周 | 命令 |
数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 | 需要执行的命令 |
周的数字为0或7都代表[星期天]。
特殊字符:
特殊字符 | 代表意义 |
---|---|
* | 代表任何时刻都接受 |
, | 代表分隔时段 |
- | 代表一段时间范围内 |
/n | n是数字,每隔n单位间隔 |
2.系统的配置文件:/etc/crontab、/etc/cron.d/*
上面的crontab -e
是针对用户的cron涉及的,如果要执行系统的例行性任务,可编辑/etc/crontab这个文件。
[root@study ~]# cat /etc/crontab
SHELL=/bin/bash <==使用哪种shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin <==执行文件查找路径
MAILTO=root <==若有额外STDOUT,以 email将资料送给谁
# 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
MAILTO=root,由于root无法再客户端中以POP3之类的协议收信,因此可换为自己的账号。
crond服务读取配置文件的位置(一般有下面3个):
/etc/crontab
/etc/cron.d/*
/etc/spool/cron/*
※如果想要自己开发的软件拥有自己的crontab定时命令,可将【分、时、日、月、周、身份、命令】的配置文件放置在/etc/cron.d/目录下。
唤醒停机期间的工作任务
1.anacron与anacron的配置文件/etc/anacrontab
anacron每小时被crond执行一次,然后anacron再去检测相关的计划任务有没有被执行,如果有超过期限的任务在,就执行该任务。
cat /etc/anacrontab
查看anacrontab。
2.捋关系
crond会主动读取/etc/crontab、/var/spool/cron/*、/etc/cron.d/*等配置文件,并根据【分、时、日、月、周】的时间设置去配置各项计划任务。
根据/etc/cron.d/0hourly的设置,主动去/etc/cron.hourly/目录下,执行所有在该目录下的执行文件。
因为/etc/cron.hourly/0anacron这个脚本文件的缘故,主动地每小时执行anacron,并调用/etc/anacrontab的配置文件。
根据/etc/anacrontab的设置,根据每天、每周、每月去分析/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly/内的执行文件,以执行固定周期需要执行的命令。
为了更清楚它们之间的关系,可cat
各个配置文件看看。
评论区