O Cronjob não executa o shell script, mas quando eu o executo, ele funciona. Por quê?

1

Tipo de casca:

>echo $SHELL
/bin/ksh

Cronjob:

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

O script é como abaixo:

##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

Eu executei os seguintes comandos e o script foi executado com êxito.

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

Como depurar? O que fazer?

    
por neal mukherjee 03.02.2015 / 21:56

4 respostas

3

Os itens no crontab são executados com um ambiente limitado. No topo do seu script você pode especificar o seu PATH, por exemplo,

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

ou, alternativamente, você pode chamar cada executável com seu caminho absoluto.

    
por 03.02.2015 / 22:01
1

Seu script faz cat wlr3queue.txt etc .... onde estão esses arquivos a serem encontrados? Quando você está tentando com a mão você está executando ./wlr3queuetransaction.sh , mas do cron você está chamando com o nome completo do caminho. Cron executará seu comando a partir do diretório pessoal do proprietário do crontab; presumivelmente, os arquivos que você está acessando em seu script não estão nesse diretório inicial.

Sempre assegure-se de que um script funcione a partir de qualquer diretório a partir do qual ele seja chamado, significando que você sempre usa nomes de caminhos completos para arquivos / diretórios ou que você faz primeiro cd no diretório correto.

Provavelmente você recebeu mensagens de e-mail com a saída de erro do script; aqueles deveriam ter te dado pistas sobre o que estava errado.

    
por 04.02.2015 / 09:48
1

Primeiro, para fins de depuração, redirecione o stderr para algum arquivo também. Desta forma, você saberá o que está errado.
15 * * * * /bin/ksh /wls_domains/resMGT/logs/bea/wlr3queuetransaction.sh 2>LOG_FILE > /wls_domains/resMGT/logs/bea/data/script.log

Em seguida, se não for um problema de localização de arquivos, dê uma olhada nesta pergunta, pois ela é muito semelhante: como definir a variável PATH crontab .

    
por 04.02.2015 / 13:09
0

Verifique a permissão do seu crontab ( /var/spool/cron/crontabs/$USER ). Deve ser 600 e proprietário root:crontab . Não funcionaria de outra forma. Além disso, é claro, verifique a sintaxe do crontab (e os finais de linha), caminhos de scripts e permissões.

    
por 18.02.2016 / 11:49