侧边栏壁纸
博主头像
伯淳的个人博客博主等级

行动起来,活在当下

  • 累计撰写 35 篇文章
  • 累计创建 5 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

计划任务

Administrator
2023-10-26 / 0 评论 / 1 点赞 / 26 阅读 / 9220 字

计划任务的方式:

  • 例行性

  • 突发性

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 各个配置文件看看。

1

评论区