利用Dock环境搭建lnmp,有些业务需用使用到cron
定时任务,在添加定时任务的时候,定时任务不执行的坑点分析。
一、代码
# docker-compose.yml 挂载倆个文件用于添加crond定时任务。
volumes:
- ./conf/php/init/dingshi.sh:/tmp/dingshi.sh
- ./conf/php/init/init.sh:/docker-entrypoint.d/init.sh
# dingshi.sh 文件内容是需要定时执行的脚本
#!/bin/bash
/usr/local/bin/php /var/www/html/public/index.php /addons/crontab/autotask/index > /dev/null 2>&1 &
# init.sh 是运行容器后先要执行的脚本
# 赋予用户执行文件的权限
chmod +x /tmp/dingshi.sh
echo "* * * * * /tmp/dingshi.sh" >> /var/spool/cron/crontabs/root
# 重启定时任务服务
/etc/init.d/cron restart
二、执行流程
重新容器的定时任务后,发现定时任务并没有执行。
在/var/log
中没有看到有关定时任务执行的日志文件。
在查询资料的过程中,发现可安装一个系统日志的组件rsyslog
用于查看定时任务的执行日志。
apt-get install rsyslog
service rsyslog start
# 查看日志
cat /var/log/syslog
在查询日志后,发现如下报错:
May 19 10:42:03 7c0e07f30856 cron[2124]: (root) INSECURE MODE (mode 0600 expected) (crontabs/root)
root文件权限必须为600。
三、解决方式
#!/bin/bash
chmod +x /tmp/dingshi.sh
echo "* * * * * /tmp/dingshi.sh" >> /var/spool/cron/crontabs/root
# 新增修改文件权限600
chmod 600 /var/spool/cron/crontabs/root
/etc/init.d/cron restart
四、衍生学习
权限字母对应权限值
- r读取权限=4
- w写入权限=2
- x执行权限=1
rwx(读、写、可执行)===4+2+1=7
rw=(读、写)===4+2=6
位置值意义
7 (所有者)7(用户组) 7(公共)
因此,上述所有的解决方式。root
文件必须是所有者有读和写的权限,才能保证定时任务的正确执行。