web-dev-qa-db-fra.com

Impossible d'exécuter le script bash à partir de crontab lorsqu'il fonctionne à partir de la ligne de commande bash

J'ai un problème étrange de pouvoir exécuter un script bash depuis la ligne de commande mais pas depuis l'entrée crontab pour root. Je suis sous 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

si j'exécute le script à partir de la ligne de commande cmd à l'aide de bash, cela fonctionne correctement mais échoue avec sh avec l'erreur suivante:

jmeter-cron-randomise.sh: 7: jmeter-cron-randomise.sh: arithmetic expression: expecting primary: "  % 1 "

Après avoir recherché le problème sur Google, il semble que le stand Shell n'ait pas les mêmes opérateurs mathématiques que% (module) comme bash. Vous ne savez pas pourquoi le travail cron échoue dans le script? je suis en train d'essayer de son parce que sa non utilisation de la coquille bash? Il est définitivement déclenché par le démon cron (vous pouvez le voir dans/var/log/syslog). Toute aide très appréciée.

script causant les problèmes

#!/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
3
kal

Je remarque dans la page de manuel crontab (5) , ceci:

Le champ `` sixième '' (le reste de la ligne) spécifie la commande à exécuter. La totalité de la partie commande de la ligne sera exécutée par /bin/sh ou par le shell spécifié dans la variable shell du fichier cronfile.

Donc, vous voudrez peut-être spécifier bash soit avec

Shell=/bin/bash

ou, comme ce qui précède affecte tous les scripts cron, cela

* * * * 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
# ...............^^^^
4
glenn jackman

La crontab fait exécute le script avec bash;

Mais vous l'exécutez de manière récursive avec at.

Et at utilise /bin/sh.

En raison d'un problème antérieur, la spécification de l'heure pour at est now+0min - elle est donc réexécutée à la fin.

Cette exécution échoue, donc il n'y a pas de boucle, au moins.

Le problème menant à now+0min est que n % 1 est égal à 0, donc $RANDOM % 1 = 0 et rmin = 0.

Ajouter une deuxième ligne

set -x

au script pour une meilleure journalisation, vous aurez la dernière ligne avec le 0 timespec.

0
Volker Siegel