1、cron和crontab命令详解
crontab 每分钟、每小时、每天、每周、每月、每年定时执行 crontab每5分钟执行一次
cron机制
cron可以让系统在指定的时间,去执行某个指定的工作,我们可以使用crontab指令来管理cron机制crontab参数
-u:这个参数可以让我们去编辑其他人的crontab,如果没有加上这个参数的话就会开启自己的crontab
crontab -u 使用者名称
-l:可以列出crontab的内容
-r:可以移除crontab
-e:可以使用系统预设的编辑器,开启crontab
-i:可以移除crontab,会跳出系统信息让你再次确定是否移除crontab
crontab时间格式说明
minute(分)可以设置0-59分
hour(小时)可以设置0-23小时
day of month(日期)可以设置1-31号
month(月份):可以设置1-12月
day of week(星期):可以设置0-7星期几,其中0和7都代表星期天,或者我们也可以使用名称来表示星期天到星期一,例如sun表示星期天,mon表示星期一等等
crontab时间格式范例
1-3表示123
1-9/2表示13579
crontab范例
每五分钟执行 */5 * * * *
每小时执行 0 * * * *
每天执行 0 0 * * *
每周执行 0 0 * * 0
每月执行 0 0 1 * *
每年执行 0 0 1 1 *
设定cron的权限
/etc/cron.allow
/etc/cron.deny
系统首先判断是否有cron.allow这个文件,如果有这个文件的话,系统会判断这个使用者有没有在cron.allow的名单里面,如果在名单里面的话,就可以使用cron机制。如果这个使用者没有在cron.allow名单里面的话,就不能使用cron机制。
如果系统里面没有cron.allow这个文件的话,系统会再判断是否有cron.deny这个文件,如果有cron.deny这个文件的话,就会判断这个使用者有没有在cron.deny这个名单里面,如果这个使用者在cron.deny名单里面的话,将不能使用cron机制。如果这个使用者没有在cron.deny这个名单里面的话就可以使用cron机制。
如果系统里这两个文件都没有的话,就可以使用cron机制
介绍crontab文件
/etc/crontab
在这个文件里并没有记录系统要执行哪些工作,而是记录了下面四个子目录。
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly
这些子目录里存放了一些脚本,到了crontab所指定的时间点,系统就会去执行这些子目录里的脚本。
2、ubuntu 16.04 计划任务crontab 周期执行任务
crontab主要作用:
比如我们每天需要清空日志记录文件,我们可以执行一段指令去完成,每天都需要手动输入就比较麻烦,让系统每天去帮我们完成就比较轻松了,根据你自己的定义 可以定位到月 日 时 分 星期 ,以前有个很有名的病毒 '黑色星期五' 每到了周五就发作,计划任务和它一样的道理,只不过没有破坏性,
1、 计划任务,crontab命令选项:
-u指定一个用户,-l列出某个用户的任务计划,
-r删除某个用户的任务,
-e编辑某个用户的任务
2 cron文件语法:
分 小时 日 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command
可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件
"*"代表取值范围内的数字,
"/"代表"每",
"-"代表从某个数字到某个数字,
","分开几个离散的数字
3、查看计划任务 查看调度任务
crontab -l //列出当前的所有调度任务
crontab -l -u jp //列出用户jp的所有调度任务
实例1:
(1)在当前家目录下创建shell脚本123.sh(实现排序)如下
#!/bin/bash
arr=(1 5 4 5 6 7 0)
for (( i=0 ; i<${#arr[@]} ; i++ ))
do
for (( j=${#arr[@]} - 1 ; j>i ; j-- ))
do
#echo $j
if [[ ${arr[j]} -lt ${arr[j-1]} ]]
then
t=${arr[j]}
arr[j]=${arr[j-1]}
arr[j-1]=$t
fi
done
done
echo "排序后:"
echo ${arr[@]}
(2)输入crontab -e 添加计划任务(不指定用户就是当前用户)
第一次会让你选择编译器,如果选错编译器了要更改编译器 输入 select-editor 重新选择
ubuntu截图用shift+PrintScreen 选择 ’复制到剪切板‘ 就可以了
我选的是vim ,看个人习惯
(3)在文本最后输入我们要执行的shell脚本命令
* * * * * 代表每分钟执行一次
按esc 输入:wq 保存退出
(4) 重启cron服务:
service cron restart
(5)查看结果
用户家目录下查看任务有没有执行,如果执行了应该是有pa.txt文件的(任务有重定向到文件)
查看文件内容
如果你要周期执行python脚本,你只需要把脚本写好,然后将cron那里的执行命令写成 python3 脚本目录文件名就可以
比如 :
* * * * * python3 ~/hello.py > 123.txt
总结:
linux中将一个脚本文件作为一个计划任务小结,以python脚本为例:
1 创建脚本文件test.py,在文件开头需要加上下面一行
#!/usr/bin/python
上面这行的作用是说明使用那个解释器来执行该文件,如果不知道python解释器在哪,可以使用命令which python来查看
2 给该文件添加可执行的权限
chmod +x test.py
3 添加计划任务
crontab -e
在文件中追加一行,*/2 * * * * /usr/bin/python /home/pc/work/ENV/project/test.py
保存退出,:wq
4 重启cron服务
service cron restart
结束
建议该过程中添加日志重定向:因为每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。参考:1)https://blog.csdn.net/dancen/article/details/24355287 2)http://blog.51cto.com/skypegnu1/1428632
3、环境变量配置
1)环境变量文件
参考:https://blog.csdn.net/jiangjiang_jian/article/details/80785080
2)环境变量配置
如果周期命令中涉及到自己写的模块,一定要在/etc/profile和/etc/environment(一定)中添加好自己包的路径。附:二者区别
4、crontab定时任务不执行的原因
参考:https://blog.csdn.net/u011734144/article/details/54576469
5、例程
1)selenium+python脚本执行完毕后直接将生成的报告发送到指定邮箱
参考文献
https://blog.csdn.net/csdn265/article/details/51569669