私はこの単純なbashスクリプトをcronjobで動作させようとしています。 GoAccessを使用して静的nginx Webサーバー統計ページを生成するために使用されます。
私はこの問題を解決するために私が知っているすべてを試しましたが、cronjobでは動作しません。コンソールで完全に実行されます。 goaccessへの呼び出しを削除すると、cronjobとしても機能します(たとえば、呼び出しが正しく構築されたことを確認するためにそこにエコーを追加します)。
これに役立ちますか?スクリプトは各ファイルに対して実行されますが、結果ファイルには引数なしで呼び出されたときに表示される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
高アクセスとは何ですか?標準コマンドでも定義した関数でもないため、最初に宣言するか、その関数を含むファイルをインポートする必要があります。