Linux中的定时任务--crontab

crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。


一、创建定时任务

# 定时任务有两种创建方法
# 一、用户任务调度:属于用户定时任务,用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。一般都直接用这个来创建

# 操作 crontab 的语句说明
crontab -e:编辑该用户的计时器设置;这个命令可以直接在最下边写定时语句,完成后ctrl+x选y,再回车,完成定时设置
#crontab -e 执行后的文件保存在这里---》》》 /var/spool/cron/crontabs 有个和用户同名的文件
crontab -l:列出该用户的计时器设置;可以查看已有的定时任务,其实就是把-e的东西全部显示了出来而已
crontab -r:删除该用户的计时器设置;
crontab -u<用户名称>:指定要设定计时器的用户名称。

# 定时的命令说明:用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
* * * * * command  顺序:分 时 日 月 周 执行语句

其中:
第一颗星: 表示分钟minute,可以是从059之间的任何整数。
第二颗星:表示小时hour,可以是从023之间的任何整数。
第三颗星:表示日期day,可以是从131之间的任何整数。
第四颗星:表示月份month,可以是从112之间的任何整数。
第五颗星:表示星期几week,可以是从07之间的任何整数,这里的07代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

在以上各个字段中,还可以使用以下特殊字符:

星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。


#二、系统任务调度:属于全局定时任务,系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。
#在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

/etc/crontab文件包括下面几行:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/

# run-parts
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

#前四行是用来配置crond任务运行的环境变量
#第一行SHELL变量指定了系统要使用哪个shell,这里是bash,
#第二行PATH变量指定了系统执行命令的路径,
#第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,
#第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。

二、配置文件详解

Linux中的定时任务--crontab_第1张图片
三、权限

1、如果cron.allow和cron.deny两个文件都不存在,则只有root用户才能使用crontab命令。 
2、如果cron.allow存在但cron.deny不存在,则只有列在cron.allow文件里的用户才能使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab。 
3、如果cron.allow不存在, cron.deny存在,则只有列在cron.deny文件里面的用户不能使用crontab命令,其它用户都能使用。 
4、如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab,如果两个文件中都有同一个用户,以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令。 

AIX 中 普通用户默认都有 crontab 权限,如果要限制用户使用 crontab ,就需要编辑/var/adm/cron/cron.deny 
HP-UNIX 中默认普通用户没得crontab 权限 ,要想放开普通用户的crontab 权限可以编

四、创建cron定时脚本

# 这个实际上也是创建定时任务,只不过不是直接用crontab -e来添加定时任务,而是单独做了一个定时任务的文件
# 注意:这操作是直接替换该用户下的crontab,而不是新增

#第一步:写cron脚本文件,命名为crontest.cron。
15,30,45,59 * * * * echo "test....." >> test.txt  表示每隔15分钟,把test.....这句话写入到test文档中
#第二步:添加定时任务,执行命令 “crontab crontest.cron”
#第三步:"crontab -l" 查看定时任务是否成功或者检测,到/var/spool/cron下是否生成对应cron脚本

五、示例

*/1 * * * * cd /home/test && python test.py 每一分钟 cd到这个文件夹下,并且执行test.py文件
0 */1 * * * service httpd restart   每一小时 重启httpd服务
30 21 * * * service httpd restart   每天 21:30 分 重启httpd服务
26 4 1,5,23,28 * * service httpd restart    每月的1号,5号 23 号 28 号 的4点26分,重启httpd服务
26 4 1-21 * * service httpd restart 每月的1号到21号 的4点26分,重启httpd服务
*/2 * * * * service httpd restart   每隔两分钟 执行,偶数分钟 重启httpd服务
1-59/2 * * * * service httpd restart    每隔两分钟 执行,奇数 重启httpd服务
0 23-7/1 * * * service httpd restart    每天的晚上11点到早上7点 每隔一个小时 重启httpd服务
0,30 18-23 * * * service httpd restart  每天18点到23点 每隔30分钟 重启httpd服务
0-59/30 18-23 * * * service httpd restart   每天18点到23点 每隔30分钟 重启httpd服务
59 1 1-7 4 * test 'date +\%w' -eq 0 && /root/a.sh   四月的第一个星期日 01:59 分运行脚本 /root/a.sh ,命令中的 test是判断,%w是数字的星期几
*/1 * * * * sleep 30s;data >> /tmp/cron.txt  每30秒 把时间写入 /tmp/cron.txt 文件

六、注意

1、环境变量
#环境变量的值,在crontab 文件中获取不到,所以要注意,可以写脚本
2、%
#在crontab中 % 是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%
`59 1 1-7 4 * test 'date +\%w' -eq 0 && /root/a.sh `

七、开启crontab日志

# ubuntu默认没有开启cron日志记录 
1.修改rsyslog 
sudo vim /etc/rsyslog.d/50-default.conf 
#将cron前面的注释符去掉 
cron.* /var/log/cron.log 
2.重启rsyslog 
sudo service rsyslog restart 
3.查看crontab日志 
less /var/log/cron.log

查看运行时的日志文件,如果在日志文件中出现: 
No MTA installed, discarding output 
则crontab执行脚本时是不会直接错误的信息输出,而是会以邮件的形式发送到邮箱里,需要邮件服务器了,如果没有安装邮件服务器,它就会报这个错。 

如果是测试,可以参考以下方法:

在每条定时脚本后面加入:

/dev/null 2>&1

即将所有信息输入到linux操作系统中的空设备/dev/null中。 
即可解决No MTA installed, discarding output的问题。

例子: 
55 * * * * user0 python /dfs/incre/hive-incre.py >>/dfs/incre/hive-incre.log 2>&1

你可能感兴趣的:(linux,linux,crontab,定时任务)