Bash 脚本不能作为 cronjob 运行

Bash 脚本不能作为 cronjob 运行

我正在尝试让这个简单的 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?它不是标准命令,也不是您已经定义的函数,您需要在开头声明它或获取具有该函数的文件

相关内容