Cron执行Shell脚本不符合预期:GoAccess仅处理未压缩日志
Cron执行Shell脚本不符合预期:GoAccess仅处理未压缩日志
我来帮你分析下这个问题,大概率是cron的运行环境和你交互式命令行的环境不一样导致的,给你几个可行的解决方案:
1. 修正日志文件的路径(最可能的原因)
你脚本里的access.log用的是相对路径!当你在命令行手动运行时,大概率是在/var/log/apache2目录下执行脚本,所以相对路径能指向正确的日志;但cron默认是在用户的主目录(比如root的/root)下运行脚本,这时候access.log会指向/root/access.log(如果这个文件不存在,GoAccess可能会异常处理,但你说它只处理了access.log,大概率是路径匹配错了)。
把脚本里的最后一行改成绝对路径就稳妥了:
zcat /var/log/apache2/access.log.*.gz | /usr/bin/goaccess - /var/log/apache2/access.log
2. 给zcat用绝对路径,避免PATH问题
cron的PATH环境变量比交互式shell窄很多,可能找不到zcat的位置。先在命令行执行which zcat,得到它的绝对路径(比如/bin/zcat),然后把脚本里的zcat换成这个绝对路径:
/bin/zcat /var/log/apache2/access.log.*.gz | /usr/bin/goaccess - /var/log/apache2/access.log
3. 先切换到日志目录再执行命令
在脚本开头加一行切换目录的命令,确保后续的相对路径都能正确找到文件:
#!/bin/bash # 切换到apache日志目录,切换失败就退出脚本,避免错误执行 cd /var/log/apache2 || exit 1 source /root/.profile zcat access.log.*.gz | /usr/bin/goaccess - access.log
4. 给cron任务加日志,方便排查问题
如果还是有问题,可以在crontab里把脚本的输出和错误都记录下来,这样能看到具体哪里出问题了:
把crontab里的行改成:
0 * * * * /root/run_logs.sh >> /var/log/run_logs_cron.log 2>&1
运行后查看/var/log/run_logs_cron.log,就能看到脚本执行时的错误信息(比如zcat找不到、日志文件不存在之类的)。
备注:内容来源于stack exchange,提问作者kevincw01
相关产品推荐
相关产品推荐

