定时任务在开发中是很是常见的一个需求,定时检测过时优惠券、定时重启、刷新缓存、备份数据等等均可以用到定时任务。在 Linux 上通常都是经过 crontab 来实现一个定时任务,这个是基于操做系统的;固然在应用层面也是能够实现的,如使用 Swoole 的定时器,Laravel 框架的任务调度(本质上也是 crontab ), Quartz 分布式任务调度框架等等。可是基于应用层面的定时任务局限性比较大,通常都是只能使用特定的语言来开发;好比 Swoole 通常都只能用 PHP 来开发;而经过 crontab 命令,咱们能够在固定的时间间隔执行指定的系统指令或 shell 脚本,基本上就不限制于开发语言了。shell
在 Linux 下定义一个定时任务有两种方式,一个是直接修改 /etc/crontab
文件,还有一个是经过 crontab -e
命令来编辑任务文件。这两种方式的区别以下:apache
直接修改 /etc/crontab
的话在定义的时候须要在 command 以前指定一个命令的执行用户缓存
修改 /etc/crontab
只有 root 用户能用,能够更加方便的给其余用户设置计划任务;crontab -e
这种全部用户均可以使用,普通用户也只能为本身设置计划任务,而后会自动写入 /var/spool/cron/usename
中框架
系统级任务调度主要完成系统的一些维护操做,用户级任务调度主要完成用户自定义的一些任务,能够将用户级任务调度放到系统级任务调度来完成(不建议这么作),可是反过来却不行;root 用户的任务调度操做能够经过 crontab –uroot –e
来设置,也能够将调度任务直接写入 /etc/crontab
文件;须要注意的是,若是要定义一个定时重启系统的任务,就必须将任务放到 /etc/crontab
文件,即便在 root 用户下建立一个定时重启系统的任务也是无效的。分布式
crontab 的命令格式很简单,这个是定义任务的,而不是定义任务文件(任务文件就是定义实际的什么时间节点以及执行什么任务)spa
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]
简单说一下参数的含义:操作系统
-u user:用来设定某个用户的 crontab 服务 file: file 是命令文件的名字,指定一个文件而且该文件中写好了各个定时任务, 而后 crontab 会读取该文件内容而且载入 crontab -e: 编辑某个用户的 crontab 文件内容, 默认编辑当前用户的 crontab 文件 -l: 显示某个用户的 crontab 文件内容,默认显示当前用户的 crontab 文件内容 -r: 从 /var/spool/cron 目录中删除某个用户的 crontab 文件,默认删除当前用户的 crontab 文件 -i: 在删除用户的 crontab 文件时给确认提示
以上是使用 crontab 命令时的参数以及含义,这个文件格式才是真正定义时间和任务的。格式以下:rest
* * * * * *
具体含义是:日志
第 1 列分钟 0~59 第 2 列小时 0~23(0表示子夜) 第 3 列日 1~31 第 4 列月 1~12 第 5 列星期 0~7(0和7表示星期天) 第 6 列要运行的命令
能够看一张图片来加深记忆:code
在使用的时候能够直接经过 crontab -e
来打开而且编辑当前的定时任务配置文件, 而后能够经过 crontab -l
来列出 crontab 文件内容.
* * * * * command
3,15 * * * * command
这个颇有用, 特别是在定时抓取一些开彩数据就能够用到, 你懂的。
3,15 8-11 * * * command
3,15 8-11 * * 1 command
30 21 * * * /etc/init.d/smb restart
* */1 * * * /etc/init.d/smb restart
0 23-7 * * * /etc/init.d/smb restart
有时候建立了一个任务,可是这个任务却没法自动执行,而手动执行这个任务却没有问题,这种状况通常是因为在 crontab 文件中没有配置环境变量引发的。
在 crontab 文件中定义多个调度任务时,须要特别注环境变量的设置,由于咱们手动执行某个任务时,是在当前 shell 环境下进行的,程序固然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,所以,就须要在 crontab 文件中指定任务运行所需的全部环境变量。建议在定义任务的时候路径都使用绝对 路徑。
基本上 crontab 的最低检测时间单位是分钟,因此会每分钟读取一次 /etc/crontab
与 /var/spool/cron
中的数据内容;所以只要编辑完文件而且保存以后,crontab 时设定就会自动执行;固然若是重启 crontab 则能够当即执行了。当 crontab 失效时,能够尝试重启:
/etc/init.d/crond restart
或者查看日志看某个任务有没有执行报错:
tail -f /var/log/cron
附上 Ubuntu 上的重启命令:
$sudo /etc/init.d/cron start $sudo /etc/init.d/cron stop $sudo /etc/init.d/cron restart
每条任务调度执行完毕,系统都会将任务输出信息经过电子邮件的形式发送给当前系统用户,这样日积月累日志信息会很是大,可能会影响系统的正常运行;所以,将每条任务进行重定向处理很是重要,能够在定义任务的时候忽略日志输出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
欢迎关个人我的公众号:左手代码