linux 定时任务
设置定时任务
进入定时任务设置
crontab -e
编辑完成后,esc,输入wq!保存即可(此时即已经生效)
常见问题
- 重启crond出现错误
(CRON) DEATH (can't lock /var/run/crond.pid, otherpid may be 97764): 资源暂时不可用
直接kill -9 [pid] 把现有的crond进程干掉,然后 sudo service crond restart
如果还是无法解决,输入命令查看cron日志:
cat /var/log/cron
如果仍然觉得没有反应,也有可能是执行你的命令报错了。将cron的日志重定向一下(注意这里有个坑):
*/1 * * * * echo "hello, world!" >> /root/cron/test/$(date +"\%Y-\%m-\%d").log 2>&1
坑:这里的日志文件夹,必须手动创建出来到/test这一级,后面日志文件会自动创建,如果你没有这一级目录,它不会产生日志文件,感觉就像cron没有反应一样
- 定时重启pm2报错
/usr/bin/env: node: 没有那个文件或目录
需要建立一个软链接:
ln -s /usr/local/NODEJS_HOME/bin/node /usr/bin/node
解决方案,来源自:https://cloud.tencent.com/developer/article/1028166
cron表达式有5、6、7位3种
(Linux中的crontab命令中就是5位)、6位、7位之分,不同位数之间以空格分隔
位数与每位的含义
- 5位:* * * * * 分、时、天、月、周
- 6位:* * * * * * 秒、分、时、天、月、周
- 7位:* * * * * * * 秒、分、时、天、月、周、年
在大部分情况下会省略年这一位,成为6位,再省略秒,就成为5位。
注意:Linux中的crontab表达式只有5位。
记录输出
以日期命名日志:
##每天10点执行
00 10 * * * /usr/bin/php -f /home/cron/phpmailer/phone.php >> "/home/cron/phpmailer/log/phone-$(date +"\%Y-\%m-\%d").log" 2>&1
##第二种
00 10 * * * /usr/bin/php -f /home/cron/phpmailer/phone.php >> /home/cron/phpmailer/log/phone-$(date +""\%Y-\%m-\%d"").log
2>&1 表示把标准错误输出重定向到与标准输出一致,不管错误的还是正常的日志都写入到文件中
常用定时时间
时间格式
分钟 小时 日期 月份 周 命令
数字范围 0-59 0-23 1-31 1-12 0-7 echo "hello" >> abc.log
特殊字符的含义
*(星号) 代表任何时刻都接受。
,(逗号) 代表分隔时段的意思。
-(减号) 代表一段时间范围内。
/n(斜线) 那个 n 代表数字,每隔 n 单位间隔。
eg1: 每年的五月一日 10:5 执行一次
5 10 1 5 * command(要是执行网址(curl "http://网址"),或者执行其它的直接写路径)
eg2: 每天的三点,六点各执行一次
00 3,6 * * * command
eg3: 每天的8:20, 9:20,10:20,11:20各执行一次
20 8-11 * * * command
eg4: 每五分钟执行一次
*/5 * * * * command
*/1 * * * * command # 每分钟执行一次,等价于: * * * * * command
eg5: 每周一十点执行一次
00 10 * * 1 command