记定时任务cron的一个坑,cron命令里面百分号%的意义
在使用elastic APM时候,现在的apm版本不支持自动删除过期index,需要使用curator手动删除或者添加到定时任务执行。
命令是
/usr/local/bin/curator_cli --host localhost delete_indices --filter_list '[{"filtertype":"pattern","kind":"prefix","value":"apm-6.3.1-"}, {"filtertype":"age","source":"name","timestring":"%Y.%m.%d","unit":"days","unit_count":20,"direction":"older"}]'
命令中有个根据index名中时间戳的判断,"timestring":"%Y.%m.%d",这中间使用了%,而%在cron里是有特殊含义的,需要转义处理,这之前没有遇到过,所以定时任务一直没成功。
以下内容来自网络
Cron daemon,是linux下用来周期性执行命令的守护进程。可以通过crontab命令列出和编辑用户的cron任务。
(1)cron任务的基本形式是:minute hour [day of month] month [day of week] command
cron任务执行时必须满足以下条件:分钟、小时和月份满足给定条件,并且day of month和day of week至少一个满足条件。
(2)在设置时间日期时,可以使用范围或者列表
比如以下命令会在每天0点到4点,8点到12点的1、2、5、9分钟执行command命令
1,2,5,9 0-4,8-12 * * * command
(3)在设置时间日期时,可以使用步长,步长仅对范围或者*有效
比如每5分钟执行command命令,可以
*/5 * * * * command
下面的命令会在第50、51、52、53、55、57、59分钟执行command命令
50,51,52,53-59/2 * * * * command
(4)month或者day of week域,可以使用星期或者月份的前三个字母,大小写都可以,但是此时不能使用范围或者列表。比如
* * * * Mon command
(5)在第6个域,也就是命令部分,%具有特殊含义,%之前的部分会被SHELL执行,%之后的部分将会作为前面部分的标准输入。如果确实需要使用%,请用\进行转义或者使用单引号(即\%或者'%',双引号"%"是无效的)。
(6)每隔一周执行一个任务,这样的任务cron是不支持的。但是我们可以通过一个trick实现,其它的每N天(周,年)也可以用类似的方式实现
每偶数周执行(注意%之前的),
* * * * * expr `date +\%W` \% 2 >/dev/null || command
每奇数周执行(最后的true命令,是为了避免cron在偶数周的时候提示非0返回码),
* * * * * expr `date +\%W` \% 2 >/dev/null && command || true
(7)每90分钟执行命令,一个cron任务是不够的
0 0,3,6,9,12,15,18,21 * * * <commands>
30 1,4,7,10,13,16,19,22 * * * <commands>
(8)不同的Unix系统提供的cron功能略有差别,如果你使用的不是Linux,请man 5 crontab