crontab详解

2019/02/28 crontab

定时任务Crontab

表达式格式

image

命令格式

crontab [-u user] file
或者
crontab [-u username]     //可选,省略则表示操作当前用户的crontab
        -e        //编辑crontab定时任务
        -l        //列出crontab里的内容
        -r        //删除crontab
  • -u user:用来设定某个用户的crontab服务;
  • file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
  • -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
  • -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
  • -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
  • -i:在删除用户的crontab文件时给确认提示。

crontab的命令由时间和命令构成,其时间由分、时、日、月、周五种按顺序排列,操作符有:

*:任何时间
/:每隔多久
-:连续时间
,:不连续的时间

实例说明

每分钟执行一次命令

* * * * * 命令
每小时的第10分钟和第30分钟执行

10,30 * * * * 命令
在8点到10点的每分钟执行

* 8-10 * * * 命令
每月15号每隔10分钟执行

*/10 * 15 * * 命令
每周一的六点三十分执行

30 6 * * 1 命令

系统运行的调度程序

/etc/crontab

同时在/etc目录下还存放了/etc/cron.deny 和 /etc/cron.allow 文件
/etc/cron.deny 表示不能使用crontab 命令的用户
/etc/cron.allow 表示能使用crontab的用户。
如果两个文件同时存在,那么/etc/cron.allow 优先。
如果两个文件都不存在,那么只有root用户可以安排作业。

用户任务文件

/var/apool/cron/用户

查看日志

记录是否执行了某些计划的脚本

$ less /var/log/cron

具体执行是否正确以及脚本执行过程中的一些信息则linux会每次都发邮件到/var/spool/mail下面

$ cd  /var/spool/mail

通过这些就可以判断脚本执行正确与否,及执行过程中是否正确以及一些错误的信息,除此之外 cron 还可以添加邮件通知

#你的命令要在哪运行
SHELL=/bin/bash
#为这个shell添加环境变量,如你的命令需要java环境
PATH=$PATH:/your_jdk_path
#当运行出错将邮件发送给谁
MAILTO=user_name或者你的qq邮箱

一次性任务At

at 命令是用来执行一次性任务,比如要在二十分钟后重启,要在 2 分钟后启动一个可执行程序,或者在一天后执行一个脚本。适合应对突发性和临时性的任务。

at 时间

-l:列出当前用户的at任务列表,也可使用 atq
-d 任务编号:取消一个at 任务,后面跟 at 任务编号,也可使用atrm 任务编号代替
-c 任务编号:显示该任务的实际内存,如:at -c 1 ,显示 1 号任务的详情

at 时间有多种指定方式:

HH:MM 如: at 02:30 HH:MM YYYY-MM-DD 如:at 8:00 2020-01-01 HH:MM[am | pm] [month] [date] 如:at 8:00 Oct 1 # 在十月一号的八点 4.HHlMM[am | pm] + number [minutes | hours | days | weeks] 如:at 8:00 + 1days 最常用的的一个时间:now + 时间 比如在十分钟后:at now + 10 minutes,在一天后:at now + 1 days

使用at 命令设定在5分钟后执行该脚本文件

[root@www /]# at now + 5 minutes
at> /hello.sh
at> <EOT>   # 在输入命令后 按 ctrl +d 结束输入,并提示我们 此任务编号为7
job 7 at 2017-07-08 19:15
# 查看任务详情
[root@www /]#at -c 7    
#!/bin/sh
# atrun uid=0 gid=0
...
...
...
# 省略一大堆系统设置的变量
${SHELL:-/bin/sh} << 'marcinDELIMITER1585a268'
/hello.sh # 这就是我们要执行的命令
# 删除job
[root@www /]#at -d 7

延伸

通过这些了解,我们可以做个调度系统,通过脚本设定定时任务。当我有十几台甚至上百台服务器,通过这个系统,可以极大解放劳动力,便于管理。

参考

https://www.cnblogs.com/xd502djj/p/4292781.html

Search

    Table of Contents