定时任务是开发中很常见的需求。定时任务可用于定时检测过期优惠券、定时重启、刷新缓存、备份数据等。在Linux上,crontab一般用于实现一个定时任务,它是基于操作系统的;当然也可以在应用层面实现,比如使用Swoole定时器、Laravel框架的任务调度(本质上就是crontab)、Quartz分布式任务调度框架等等。但是基于应用层面的定时任务有比较大的局限性,一般只能使用特定的语言进行开发;例如,Swoole只能使用PHP开发;而通过crontab命令,我们可以按照固定的时间间隔执行指定的任务。系统命令或shell脚本基本不受开发语言的限制。定义方法Linux下定义定时任务有两种方法,一种是直接修改/etc/crontab文件,另一种是通过crontab-e命令编辑任务文件。这两种方式的区别在于:定义方式不同,如果直接修改/etc/crontab,定义时需要在命令前指定一个命令执行用户范围。其他用户设置定时任务;crontab-e所有用户都可以使用,普通用户只能给自己设置定时任务,然后在/var/spool/cron/usename中自动写入系统级任务和用户级任务级别任务调度主要完成一些维护操作系统的。用户级任务调度主要完成一些用户自定义的任务。可以把用户级的任务调度放到系统级的任务调度中去完成(不推荐),反之则不行。;root用户的任务调度运行可以通过crontab–uroot–e设置,也可以直接将调度任务写入/etc/crontab文件;需要注意的是,如果要定义定时重启系统的任务,必须将任务设置在/etc/crontab文件中,即使在root用户下创建定时重启系统的任务也是无效的.如何使用命令格式crontab的命令格式非常简单。这里是定义任务,不是任务文件(任务文件是定义实际时间节点和执行什么任务)crontab[-uuser]filecrontab[-uuser][-e|-l|-r]简单说一下参数的含义:-uuser:用来设置某个用户的crontab服务文件:file是命令文件的名字,指定一个文件,在文件中写入每个定时任务,crontab会读取文件的内容并加载到crontab中-e:编辑一个用户的crontab文件的内容,默认编辑当前用户的crontab文件-l:显示一个用户的crontab文件的内容,显示当前crontabfiledefault用户的crontab文件内容-r:从/var/spool/cron目录下删除一个用户的crontab文件,默认删除当前用户的crontab文件是使用crontab命令时的参数及含义。这种文件格式真正定义了时间和任务。格式如下:******具体含义为:第一列分钟0~59第二列小时0~23(0表示午夜)第三列日1~31第四列月1~12第五列week0~7(0和7代表星期日)6列要运行的命令可以看一张图加深记忆:使用时直接打开编辑当前的定时任务配置文件通过crontab-e,然后可以通过crontab-l来列出crontab文件的内容。常见的例子每1分钟执行一次command*****命令,每小时每3、15分钟执行一次3,15****命令,非常有用,尤其是在计时的时候抓取一些彩票数据就可以使用,你知道。3,158-11***命令在第3和第15分钟8点到11点执行3,158-11***命令每周一8点到11点在第3和第15分钟命令Restartsmb30at每晚21:3021***/etc/init.d/smbrestart每小时重新启动smb**/1***/etc/init.d/smb从晚上11:00重新启动到7:00a.m.之间,每隔一小时restartsmb023-7***/etc/init.d/smbrestart常见问题环境变量问题有时候会创建一个task,但是这个task不能自动执行,而是手动执行没问题,这种情况一般是没有在crontab文件中配置环境变量造成的。在crontab文件中定义多个调度任务时,需要特别注意环境变量的设置,因为我们手动执行一个任务时,是在当前的shell环境下进行的。当然程序可以找到环境变量,系统自动执行任务调度,不会加载环境变量,所以需要在crontab文件中指定任务运行所需的所有环境变量。定义任务时推荐使用绝对路径。执行时间基本上是 crontab的最小检测时间单位是分钟,所以每分钟都会读取/etc/crontab和/var/spool/cron中的数据内容;所以只要文件被编辑保存,crontab就会自动执行设置;当然,如果重启crontab,是可以立即执行的。当crontab失败时,可以尝试重启:/etc/init.d/crondrestart或者查看日志看是否有任务执行出错:tail-f/var/log/cron在Ubuntu上附上重启命令:$sudo/etc/init.d/cronstart$sudo/etc/init.d/cronstop$sudo/etc/init.d/cronrestartsystemlog每个任务调度执行后,系统会发送任务输出信息通过邮件发送给当前系统用户,这样累积的日志信息会非常大,可能会影响系统的正常运行;因此,重定向每个任务非常重要,定义任务时可以忽略日志输出:0*/3***/usr/local/apache2/apachectlrestart>/dev/null2>&1欢迎关闭我的个人公众号:左手密码
