Cronjob은 쉘 스크립트를 실행하지 않지만 독립형으로 실행하면 작동합니다. 왜?

Cronjob은 쉘 스크립트를 실행하지 않지만 독립형으로 실행하면 작동합니다. 왜?

주택 유형:

>echo $SHELL
/bin/ksh

예약 된 일들:

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

crontab의 프로젝트는 제한된 환경에서 실행됩니다. 스크립트 상단에서 PATH를 지정할 수 있습니다. 예를 들어,

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

또는 절대 경로를 사용하여 각 실행 파일을 호출할 수 있습니다.

답변2

귀하의 스크립트 cat wlr3queue.txt등... 이러한 파일은 어디에서 찾을 수 있습니까? 수동으로 시도하면 실행 중이지만 ./wlr3queuetransaction.shcron에서는 전체 경로 이름으로 호출됩니다. Cron은 crontab 소유자의 홈 디렉터리에서 명령을 실행합니다. 아마도 스크립트에서 액세스하는 파일은 해당 홈 디렉터리에 없을 것입니다.

언제나스크립트가 호출되는 모든 디렉토리에서 실행될 수 있는지 확인하십시오. 즉, 항상 파일/디렉토리의 전체 경로 이름을 사용하거나 cd올바른 디렉토리로 먼저 이동하십시오.

아마도 스크립트의 오류 출력이 포함된 이메일을 받았을 것입니다. 이는 문제가 무엇인지에 대한 단서를 제공할 것입니다.

답변3

먼저, 디버깅 목적으로 stderr을 일부 파일로 리디렉션합니다. 그렇게 하면 무엇이 잘못되었는지 알 수 있습니다.
15 * * * * /bin/ksh /wls_domains/resMGT/logs/bea/wlr3queuetransaction.sh 2>LOG_FILE > /wls_domains/resMGT/logs/bea/data/script.log

다음으로, 파일 위치 문제가 아닌 경우 매우 유사하므로 다음 질문을 살펴보세요. crontab PATH 변수를 설정하는 방법.

답변4

crontab귀하의 ( ) 권한을 확인하십시오 /var/spool/cron/crontabs/$USER. 600주인과 함께 있어야 합니다 root:crontab. 그렇지 않으면 작동하지 않습니다. 물론 crontab 구문(및 줄 끝), 스크립트 경로 및 권한을 확인하세요.

관련 정보