Não é possível executar o script bash a partir do crontab quando ele funciona a partir da linha de comando bash

3

Eu tenho um problema estranho de ser capaz de executar um script bash a partir da linha de comando, mas não da entrada crontab para o root. Estou executando o Ubuntu 12.04.

* * * * 1-5 root /home/xxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/jmeter-cron-randomise.sh >> /home/xxxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/cron.log

se eu executar o script a partir da linha cmd usando o bash ele funciona bem, mas falha com o seguinte erro:

jmeter-cron-randomise.sh: 7: jmeter-cron-randomise.sh: arithmetic expression: expecting primary: "  % 1 "
Tendo googled o problema, parece que o stand shell não tem os mesmos operadores matemáticos como% (modulus) como o bash. Não sabe por que o cron job está falhando no script? Eu estou assumindo que é porque não está usando o shell bash? Ele definitivamente está sendo disparado pelo daemon do cron (pode ver em / var / log / syslog). Qualquer ajuda muito apreciada.

script causando os problemas

#!/bin/bash
echo Running the jmeter-cron-randomiser script


script="/home/xxxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/jmeter-cron.sh"    

min=$(( 1 * 1 ))
rmin=$(( $RANDOM % $min ))

echo  "min = ${min}";
echo  "rmin = ${rmin}"

at -f "$script" now+${rmin}min
    
por kal 23.10.2014 / 16:44

2 respostas

4

Eu anoto na página do manual crontab (5) , esta:

  

O campo '' sexto '' (o resto da linha) especifica o comando a ser          corre. A porção inteira do comando da linha será executada por           / bin / sh ou pelo shell especificado na variável SHELL do          cronfile.

Então, você pode querer especificar o bash com

SHELL=/bin/bash

ou, como o acima afeta todos os scripts cron, isso

* * * * 1-5 root bash /home/xxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/jmeter-cron-randomise.sh >> /home/xxxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/cron.log
# ...............^^^^
    
por glenn jackman 23.10.2014 / 17:42
0

O crontab faz executar o script com bash ;

Mas você está usando recursivamente com at .

E at usa /bin/sh .

Por causa de um problema anterior, a especificação de tempo para at é now+0min - portanto, ele está sendo executado novamente no final.

Essa execução falha, portanto, não há loop, pelo menos.

O problema que leva à now+0min é que n % 1 é 0, então $RANDOM % 1 = 0 e rmin = 0.

Adicione uma segunda linha

set -x

para o script para melhor registro, você será a última linha com o 0 timespec.

    
por Volker Siegel 23.10.2014 / 18:26