每天我们重复干的事情有多少——频繁看论坛回帖、频繁看股市行情、定时查邮件、定时休息、定时切换桌面壁纸、定时备份重要文件、定时清理系统、定时更新系统、定时提醒重要事情等等等等,这些都可以通过cron来完成。

Cron是Linux下的无图形界面的计划任务工具,对Linux运维自动化具有极其重要的作用,也可以适用于web爬虫采集类的工作。当然,它的功用还远不止这2个。而Linux下丰富的cli软件和强大的shell脚本让定时计划工作做起来那么自然和轻松。

Cronie

在Ubuntu 16.04及其衍生版本如LinuxMint 18.1里开启cron定时计划任务步骤其实很简单:

  1. 安装cronie
apt install cron

2. 开通并开启cronie后台服务

sudo systemctl enable cron.service; sudo systemctl start cron.service

3. 建立一个MyCrontab(名字可以随便取)的文件并编辑之。

touch ~/MyCrontab && nano ~/MyCrontab

参考下面的《crontab写法举例》介绍来编辑这个文件。

4. 载入MyCrontab计划到cron服务模块中

crontab ~/MyCrontab

5,查看crontab计划,看看是否一切就绪

crontab -l

Crontab写法举例

#<分钟> <小时> <日> <月份> <星期> <命令>
*/1    *    *    *    *    date>>~/crontest
#用date>>~/crontest可以很清楚的看到测试的效果

5    *    *    *    *    ls
#指定每小时的第5分钟执行一次ls命令

30    5    *    *     *    ls
#指定每天的 5:30 执行ls命令

30    7    8    *    *    ls
#指定每月8号的7:30分执行ls命令

30    5    8    6    *    ls
#指定每年的6月8日5:30执行ls命令

30    6    *    *    0    ls
#指定每星期日的6:30执行ls命令
[注:0表示星期天,1表示星期1。星期也可以用英文来表示,sun表示星期天,mon表示星期一等。]

30    3    10,20    *    *    ls
#每月10号及20号的3:30执行ls命令
[注:“,”用来连接多个不连续的时段]

25    8-11    *    *    *    ls
#每天8-11点的第25分钟执行ls命令
[注:“-”用来连接连续的时段]

*/15    *    *    *    *    ls
#每15分钟执行一次ls命令
[即每个小时的第0 15 30 45 60分钟执行ls命令]

30    6    */10    *    *    ls
#每个月中,每隔10天6:30执行一次ls命令
[即每月的1、11、21、31日是的6:30执行一次ls 命令。]

50    7    *    *    *    root    run-parts    /etc/cron.daily
#每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件
[注:run-parts参数表示执行后面目录中的所有可执行文件。]

#“*” 代表取值范围内的数字, “/” 代表”每”, “-” 代表从某个数字到某个数字, “,” 分开几个离散的数字。

我的应用例子

因为我的Ghost博客是部署在群晖Docker上的,民用网路80端口是被屏蔽,如果想使用80端口需要换个角度思考,Nginx反向代理是可以做到的,但是还有一点要注意的,家用的网络ip是变化的,重启下ip就更换了,而Nginx也必须重启才能正确反向代理到准确的ip上,所以我需要在ubuntu上每5分钟nginx重启一次,设置如下:

*/5 * * * * root service nginx restart

Crontab书写注意事项

  • crontab -e可以编辑cron计划,但这个只会更改内存中的crontab任务。最好先编辑硬盘上的~/MyCrontab文件,然后用crontab ~/MyCrontab载入。

  • 如果不想执行某一行计划,就在行首用#注释掉。

  • 运行X程序,比如gedit,命令格式是export DISPLAY=:0.0;gedit(用env|grep DISP命令可以看到DISPLAY的名称)

检测Crontab是否正常运行

crontab -e  #编辑定时任务
crontab -l  #查看定时任务

使用 crontab -l 命令查看当前定时任务,如果当前没有任务,让服务器重启下即可。