web-dev-qa-db-ja.com

Cronjobはシェルスクリプトを実行しませんが、スタンドアロンで実行すると機能します。どうして?

シェルタイプ:

>echo $Shell
/bin/ksh

Cronjob:

15 * * * * /bin/ksh /wls_domains/resMGT/logs/bea/wlr3queuetransaction.sh > /wls_domains/resMGT/logs/bea/data/script.log

スクリプトは次のとおりです。

##log files and lookup file "wlr3queue.txt" are in the same path of the script ##/wls_domains/resMGT/logs/bea/wlr3queuetransaction.sh

Script :

#!/bin/ksh

dt=`date +%Y-%m-%d`
xy=`date|awk '{print $4}'|awk -F":" '{print $1}'`
yz=`expr $xy - 1`
if [ $yz -le 9 ]
then
yz=0$yz
fi

if [ $xy -gt 0 ]
then

for i in `cat wlr3queue.txt`
do

sum=0

count=`gzgrep -i "$dt" admin_resMGT_access.log* | grep "$yz:[0-5][0-9]" | grep "$i" | wc -l`

if [ $count -gt 0 ]
then
name=`echo $i | cut -d'/' -f3`

gzgrep -i "$dt" admin_resMGT_access.log* | grep "$yz:[0-5][0-9]" | grep "$i" | awk '{print $8}' > consumed_time.txt

for j in `cat consumed_time.txt`
do
j_ms=`echo "$j * 1000" | bc`
echo $j_ms >> consumed_ms_time.txt
done

for k in `cat consumed_ms_time.txt`
do
sum=`echo "$sum + $k" | bc`
done

avg=`echo "scale=2; ($sum/$count) "| bc`

min=`cat consumed_ms_time.txt | sort -n | head -1`

max=`cat consumed_ms_time.txt | sort -n | tail -1`

else

avg=0

min=0

max=0

fi
(
echo $yz","$count","$avg","$min","$max
)>>/wls_domains/resMGT/logs/bea/data/$name$dt.csv


rm -f consumed_ms_time.txt

done

else

echo "script won't execute at this hour" > temp.txt

fi

次のコマンドを実行しましたが、スクリプトは正常に実行されました。

./wlr3queuetransaction.sh
sh -x wlr3queuetransaction.sh
/bin/ksh /wls_domains/resMGT/logs/bea/wlr3queuetransaction.sh 
/bin/ksh/ wlr3queuetransaction.sh.

デバッグする方法は?何をすべきか?

1
neal mukherjee

Crontabのアイテムは、限られた環境で実行されます。スクリプトの上部で、たとえば、PATHを指定できます。

PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

または、絶対パスを使用して各実行可能ファイルを呼び出すこともできます。

3
inquist

スクリプトはcat wlr3queue.txtなどを実行します...これらのファイルはどこにありますか?手作業で試しているときは./wlr3queuetransaction.shを実行していますが、cronからは完全なパス名で呼び出しています。 cronは、crontabの所有者のホームディレクトリからコマンドを実行します。おそらく、スクリプトでアクセスしているファイルは、そのホームディレクトリにありません。

常にスクリプトが呼び出されたディレクトリから機能することを確認します。つまり、常にファイル/ディレクトリに完全なパス名を使用するか、最初に正しいディレクトリにcdを実行します。

おそらく、スクリプトからのエラー出力を含む電子メールメッセージを受け取ったでしょう。それらはあなたに何が悪いのかについての手がかりを与えるべきでした。

1
wurtel

まず、デバッグの目的で、stderrをいくつかのファイルにもリダイレクトします。このようにして、何がうまくいかないかを知ることができます。
15 * * * * /bin/ksh /wls_domains/resMGT/logs/bea/wlr3queuetransaction.sh 2>LOG_FILE > /wls_domains/resMGT/logs/bea/data/script.log

次に、ファイルの場所の問題ではない場合は、この質問を見てください。非常によく似ています: crontab PATH変数の設定方法

1
csny

crontab/var/spool/cron/crontabs/$USER)。そのはず 600および所有者root:crontab。それ以外の場合は機能しません。また、もちろん、crontab構文(および行末)、スクリプトパス、およびアクセス許可を確認してください。

0
Jury