Linux计划任务

十四.计划任务

计划任务顾名思义,就是周期性的执行一些任务命令,目前最主要的用途是定期备份数据。

1. at

at 命令被用来在指定时间内调度一次性的任务。 使用格式为at [-mldv] TIME
at 适合仅执行一次就结束的调度命令,需要启动一个后端的atd服务。

[[email protected] d2]# systemctl start atd  ---当前启动
[[email protected] d2]# systemctl enable atd ---开机自启动

选项与参数:

  • -m :当at的任务完成后,即使没有输出信息,也以 email 通知给使用者
  • -l :列出目前系统上面的所有该使用者的at任务(同atq)
  • -d :可以取消一个在 at 任务(同atrm)
  • -v :可以使用较明显的时间格式列出 at 任务
  • -c :可以列出后面接的该项任务的内容

at命令的时间格式:

  • now + 时间 :时间以 minutes、hours、days、或 weeks 为单位
  • HH:MM :24小时制度,如果时间已过,就会在第二天的这一时间执行
  • midnight :表示00:00
  • noon :表示12:00
  • teatime :表示16:00
示例1:
[[email protected] d2]# at 13:10 //定义一个at任务在13:10执行 
at> date >> /tmp/at //将当前时间输入/tmp/at文件 
at> echo "at command test" >> /tmp/at 
at> uname -r >> /tmp/at 
at> <EOT> //另选一行按Ctrl+D退出at命令模式 
job 1 at 2018-03-28 13:10 

示例1:
[[email protected] d2]# at now + 5 minutes //再定义一个at任务在5分钟后执行 
at> date >> /tmp/at 
at> echo "at command test again" >> /tmp/at 
at> sleep 10 
at> date >> /tmp/at 
at> <EOT> 
job 2 at 2018-03-28 13:10 

2. batch

batch 命令被用来在系统平均负载达到 0.8% 以下时执行一次性的任务,用法与at一样

[[email protected] d2]# batch midnight //在00:00之后系统平均负载达到0.8%以下的时候执行
at> sync
at> sync
at> shutdown -h now
at> 
job 3 at 2018-04-02 13:20

显示
[[email protected] d2]# atq
3 2018-04-02 13:20 b root

删除
[[email protected] d2]#  atrm 3 //取消batch任务

3. cron

查看系统crond服务有无开启,没有的话请先开启:systemctl status crond
crond进程每分钟检查一次,以运行相应的任务,crond日志文件/var/log/cron
使用命令为 crontab,使用格式为crontab [选项] hostname
查看/etc/crontab文件可以查看编辑格式,这个文件也是系统级计划任务,我们一般只做用户级计划任务 .
编写完成的可以计划任务以文件形式存放在 /var/spool/cron/username文件中。

  • -u :用户
  • -e :编辑
  • -l :列出
  • -r :删除

Crontab命令的书写格式:
Linux计划任务
书写注意点:
Linux计划任务

1.系统级计划任务-查看:
[[email protected] d2]#  vim /etc/crontab
*  *  *  *  *           root                  ls
0  *  *  *  *           root                  ls
0  2  *  *  *          root                  ls
0  2  1  *  *           root                    /mysql_back.sh
0  2  1  3  *           jack        run-parts     /cron-test


[[email protected] d2]# crontab -e              //创建计划任务
* * * * * /bin/ls
[[email protected] d2]# crontab -l                  //查看计划任务
* * * * * /bin/ls
[[email protected] d2]#ls /var/spool/cron/
root
[[email protected] d2]# cat /var/spool/cron/root 
* * * * * /bin/ls
[[email protected] d2]# tail /var/log/cron            //查看日志
[[email protected] d2]# crontab -u alice -e
[[email protected] d2]# crontab -r                    //清除所有计划任务

这里推荐一种熟练以后的简单做法,使用重定向

[[email protected] d2]# cat >> /var/spool/cron/username << EOF
> #注释
> 30 21 * * * 命令
> EOF
例子:
 30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启lighttpd 。

 45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启lighttpd 。

 10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启lighttpd 。

 0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启lighttpd 。

 0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启lighttpd 。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启lighttpd

 * 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启lighttpd

 0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启lighttpd

 0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启lighttpd

4.anacron

anacron只是cron的补充而非是完全替代 cron
cron 是作为守护进程运行的,而anacron则作为普通进程运行并终止的。anacron 维护了一组应当运行的任务,每个任务都一个相关的运行间隔。anacron 并不能指定何时运行某项任务, 而是以天为单位或者是在启动后立刻进行 anacron 的动作,当系统启动之后anacrod将会去侦测停机期间应该进行但是并没有进行的 crontab 任务,并将该任务运行一遍后,然后 anacron 就会自动停止了。
因此 anacron 运行的时间通常有两个,一个是系统启动期间运行,一个是写入 crontab 中的任务。

[[email protected] d2]# cat /etc/anacrontab
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#天数 延迟时间 任务名称定义 执行的指令
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
#由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天;
#由 /var/spool/anacron/cron.daily 取出最近一次运行 anacron 的时间戳记;
#由时间戳与目前的时间比较,若间隔天数为 1 天(以上),将延迟5分钟后执行"nice run-parts /etc/cron.daily"这条命令,且运行完毕后anacron程序结束
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly

4.1. anacron命令方法

anacron 任务被列在 /etc/anacrontab 中,任务可以使用下面的格式(anacron 文件中的注释必须以 # 号开始)安排。
#period delay job-identifier command


1.1 : period - 这是任务的频率,以天来指定,或者是
@daily 、@weekly、@monthly 代表每天、每周、每月一次。
你也可以使用数字:1 - 每天、7 - 每周、30- 每月,或者N - 几天。
1.2: delay - 这是在执行一个任务前等待的分钟数。
1.3: job-id - 这是写在日志文件中任务的独特名字。
1.4: command - 这是要执行的命令或 shell 脚本。

4.2. 如何看示列文件

要浏览示例文件,输入:

[[email protected] d2]# ls -l /var/spool/anacron/ 
total 12 
-rw------- 1 root root 9 Jun  1 10:25 cron.daily 
-rw------- 1 root root 9 May 27 11:01 cron.monthly 
-rw------- 1 root root 9 May 30 10:28 cron.weekly

anacron 会检查任务是否已经在 period 字段指定的时间被被执行了。如果没有,则在等待 delay 字段中指定的分钟数后,执行 command字段中指定的命令。
一旦任务被执行了,它会使用 job-id (时间戳文件名)字段中指定的名称将日期记录在 /var/spool/anacron 目录中的时间戳文件中。