我正在尝试让这个简单的 bash 脚本在 cronjob 中工作。它用于使用 GoAccess 生成静态 nginx Web 服务器统计页面。
我尝试了我所知道的一切来解决这个问题,它只是不能作为一个 cronjob 工作。它在控制台中完美执行。当我删除对 goaccess 的调用时,它甚至可以作为 cronjob 工作(例如,在那里放置一个 echo 来查看调用是否正确构建)。
对此有什么帮助吗?该脚本针对每个文件运行,但生成的文件仅包含来自 goaccess 的“如何使用”指令,当您不带参数调用它时会出现该指令。
系统是运行 Debian 6.0 的虚拟服务器。我使用 GoAccess 0.5 和 nginx 1.2.1
这是脚本:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/home/
_logdir="/srv/www/logs"
_logfiles="${_logdir}/access_*.log"
for logfile in $_logfiles; do
_curfilename="${logfile##*/}"
# All these commands work flawless
#echo "$logfile" >> /home/debug.log
#echo "$_curfilename" >> /home/debug.log
#echo "goaccess -a -f $logfile > /srv/www/stats/${_curfilename}.html" >> /home/debug.log;
# This one fails
goaccess -a -f "${logfile}" > "/srv/www/stats/${_curfilename}.html";
done
这是每小时一次的 crontab 行(我使用 * * * * * 进行调试):
0 * * * * /bin/bash /home/run_webstats_update.sh
cron.log 中的错误输出:
/USR/SBIN/CRON[26099]: (root) CMD (/bin/bash /home/update_webstats.sh)
/USR/SBIN/CRON[26098]: (CRON) error (grandchild #26099 failed with exit status 1)
答案1
这应该可以做到。只要确保你有正确的路径即可。顺便提一句,去访问很漂亮。
#!/bin/bash
PATH=$PATH:/home/
_logdir="/srv/www/logs"
_logfiles="${_logdir}/access_*.log"
for logfile in $_logfiles; do
_curfilename="${logfile##*/}"
cat "${logfile}" | goaccess -a > "/srv/www/stats/${_curfilename}.html"
done
您甚至可以解析压缩数据文件:
zcat -f access.log* | goaccess -a > "/srv/www/stats/${_curfilename}.html"
答案2
什么是goaccess?它不是标准命令,也不是您已经定义的函数,您需要在开头声明它或获取具有该函数的文件