Cronjob 不执行 shell 脚本,但是当我独立执行它时它可以工作。为什么?

Cronjob 不执行 shell 脚本,但是当我独立执行它时它可以工作。为什么?

外壳类型:

>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.sh但从 cron 中您正在使用完整的路径名进行调用。 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 语法(和行结尾)、脚本路径和权限。

相关内容