この単純なbashスクリプトをcronジョブ内で機能させようとしています。 GoAccessを使用して静的nginxウェブサーバー統計ページを生成するために使用されます。
この問題を解決するために知っていることをすべて試しましたが、cronジョブとしては機能しません。コンソールで完全に実行されます。 goaccessへの呼び出しを削除すると、cronjobとしても機能します(たとえば、呼び出しが正しく構築されているかどうかを確認するためにそこにエコーを配置します)。
これについて何か助けはありますか?スクリプトはすべてのファイルに対して実行されますが、結果のファイルには、引数なしで呼び出すと表示されるgoaccessからの「使用方法」の指示のみが含まれます。
システムはDebian6.0を実行しているvServerです。 GoAccess0.5とnginx1.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
これが1時間に1回の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)
これでうまくいくはずです。正しいパスを取得したことを確認してください。ところで、 GoAccess は気の利いたものです。
#!/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"
Goaccessとは何ですか?これは標準のコマンドでも、すでに定義した関数でもありません。最初に宣言するか、関数を持つファイルを入手する必要があります。