先简要说一下发生的问题吧,因昨日(2020年08月17日)升级 docker-compose 后,导致没有将 docker-compose 添加进环境变量,所以 crontab 再执行执行时找不到 docker-compose 导致无法进入容器,从而无法执行 php artisan 的命令,最终我司脚本服务器停摆问题。

排查过程

1
2
3
4
5
## 查看计划任务
crontab -e

## 将执行的机会任务输出到指定 log 文件
* * * * * /root/ga-shell/script-shell.sh >> /var/log/crontab-run.log 2>&1
1
2
3
4
5
## 查看
cat /root/ga-shell/script-shell.sh
#!/bin/bash

cd /usr/wwwroot/ga-docker-image/ && docker-compose exec php-fpm-71 php /data/www/neox-script/artisan schedule:run
1
2
3
4
1 /root/ga-shell/script-shell.sh: line 3: docker-compose: command not found
2 /root/ga-shell/script-shell.sh: line 3: docker-compose: command not found
3 /root/ga-shell/script-shell.sh: line 3: docker-compose: command not found
4 /root/ga-shell/script-shell.sh: line 3: docker-compose: command not found

原因与解决

可以明显得知,是 docker-compose 可执行文件找不到导致,

解决方式,docker-compose 使用绝对路径即可,如下:

1
2
3
4
cat /root/ga-shell/script-shell.sh
#!/bin/bash

cd /usr/wwwroot/ga-docker-image/ && /usr/local/bin/docker-compose exec php-fpm-71 php /data/www/neox-script/artisan schedule:run

继续等待脚本执行,看 log 结果如下:

1
2
3
4
5
8 the input device is not a TTY
9 the input device is not a TTY
10 the input device is not a TTY
11 the input device is not a TTY
12 the input device is not a TTY

问题原因,通过查找得知,是某些版本的 docker-compose 问题,解决方式:docker-compose exec -T 添加 -T 参数解决。

参考如下:

完整的 shell 如下:

1
2
3
4
cat /root/ga-shell/script-shell.sh
#!/bin/bash

cd /usr/wwwroot/ga-docker-image/ && /usr/local/bin/docker-compose exec -T php-fpm-71 php /data/www/neox-script/artisan schedule:run

The end!