查看了很多相关crontab定时任务的博客,觉得很有道理,但也很乱!踩了不少坑之后,下定决心写一篇平滑度过Crontab入门的博客,不当之处万望指教。
问题:
我有一个叫test4.py的Python脚本,需要定时执行,实时更新数据,需要借助Crontab命令,来调用一个.sh写好的命令行的文件,进而执行我们的test4.py文件,实现定时执行的功能。
原理框架:
我们查看Ubuntu下面的旧方法和新方法执行test4.py的Python脚本的原理上的不一样:
可以看到:旧方法直接在命令行工作而新方法把命令行下面的操作写成了.sh文件然后再利用命令行去编辑Crontab文件,再在文件里指定路径调用这个.sh,进而来跑这个Python的脚本。
基础知识:
我们需要补充一些Crontab知识:
通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。
1. 命令格式
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]
2. 命令参数
- -u user:用来设定某个用户的crontab服务;
- file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
- -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
- -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
- -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
- -i:在删除用户的crontab文件时给确认提示。
3. crontab的文件格式
分 时 日 月 星期 要运行的命令
- 第1列分钟0~59
- 第2列小时0~23(0表示子夜)
- 第3列日1~31
- 第4列月1~12
- 第5列星期0~7(0和7表示星期天)
- 第6列要运行的命令
实例1:每1分钟执行一次myCommand
* * * * * myCommand
实例2:每小时的第3和第15分钟执行
3,15 * * * * myCommand
实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand
实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * myCommand
实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand
实例6:每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
实战例子:
1、编辑crontab文件,命令行输入:$ crontab -e
按自己需要,比如我需要每两分钟执行一次,在后面输入:
*/2 * * * *sh /home/sy/log_file/hello.sh2>>/home/sy/log_file/note.log
红色部分:定时;蓝色部分:需要执行的Python脚本位置;紫色部分:把错误log信息打印在文件note.log里面。
2、查看是否新建成功:
上述界面Ctrl+X退出,然后命令行输入:
$ crontab -l
可以查看自己输入的Crontab是否存在;
3、编写.sh文件
就好像自己子在命令行里面输入是一样的;
4、编写自己的test4.py文件:
可以看到:我的Python文件有很多print和最后会保存一个“temp7777.csv”的文件
5、开始执行crontab,命令行输入:
$ sudo service cron start
如果重新多次输入,会告诉你已经开启了
如果不成功,可以选择命令行输入:
$ sudo service cron restart
6、查看结果:
可以看到元本年空白的note.log文件多了一句错误信息:
这也说明原来.sh文件的source设置多余了;
还可以看到对应文件路径下多了我们想要的文件:
实验成功了!
7、如果希望原来的print信息也打印在note.log文件里面,可以再crontab 中进行设置:
输入改成:
*/2 * * * * sh /home/sy/log_file/hello.sh 1,2>>/home/sy/log_file/note.log
多加一部分黄色的1代表正常信息添加。
就这样:每两分钟,就有一堆121212121212传进去note.log文件
8、本机下面没有必要在.sh文件里面设置环境变量,但是对于服务器来讲——需要;
首先要查看本机所有环境变量:命令行输入:
$ env|more
选择你自己所需要的,加进去source那里,就可以了。。