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