Ne peut pas exécuter des scripts bash de crontab quand il fonctionne en ligne de commande bash
J'ai un problème étrange d'être à la mesure d'exécuter un script bash à partir de la ligne de commande, mais pas de l'entrée crontab de 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 je lance le script à partir de la ligne de cmd à l'aide de bash, il fonctionne très bien mais sh
échoue avec l'erreur suivante:
> jmeter-cron-randomise.sh: 7: jmeter-cron-randomise.sh: arithmetic
> expression: expecting primary: " % 1 "
Avoir googlé le problème, il semble que shell standard n'ont pas le même niveau en mathématiques les opérateurs, comme % (modulo), que bash. Je ne suis Pas sûr pourquoi, la tâche cron est un échec dans le script? Je suppose que c'est parce qu'il n'est pas en utilisant le shell bash? Il est certainement être déclenché par le démon cron (pouvez le voir dans /var/log/syslog). Toute aide appréciée.
son #!/bin/bash
Est-ce que votre
cron
exécutez la commande avec /bin/sh
? On dirait qu'il n'est probablement parce que l'erreur est ce que vous aimeriez avoir si vous avez exécuté le script avec sh
au lieu de bash
(comme dans: sh /home/…/jmeter-cron-randomise.sh
). Et sur Ubuntu, /bin/sh
est souvent dash
, pas bash
. Pour corriger, utilisez bash /home/…/jmeter-cron-dandomise.sh >> …
dans votre entrée crontab.Regarde comme il est en cours d'exécution sh. Comment puis-je le forcer à exécuter bash en dehors de la ligne shebang?
kal: exécuter
bash /path/of/script.sh
. Cette bash
devrait être la sortie de which bash
, c'est le chemin complet de l'exécutable.OriginalL'auteur kal | 2014-10-23
Vous devez vous connecter pour publier un commentaire.
Vous avez probablement besoin de dire cron que le shell à utiliser est le shell bash en tant que par défaut pour les poissons. Vous pouvez le faire pour tous les crontab entrées en mettant cette ligne dans votre crontab:
Noter que ce sera la cause de tous les scripts dans la crontab pour être exécuté sous bash qui peut ne pas être ce que vous voulez. Si vous souhaitez modifier la crontab de la ligne elle-même de l'exécuter à bash, changer à cela:
Noter que j'ai également causé stderr être écrit dans le cron.fichier journal (2>,&1), qui peut ne pas être ce que vous voulez mais il est assez courant. Cela peut vous aider à diagnostiquer des erreurs dans le script.
/bin/bash
ou il peut être/usr/bin/bash
ou quoi que ce soit. Il est intéressant de mentionner que le véritable chemin d'accès complet peut être obtenu avecwhich bash
.merci. retour à l'aide de l'entrée crontab via crontab -e pour l'utilisateur root et de faire face au problème d'origine, je peux voir utile des messages d'erreur maintenant ------ Exécution de la jmeter-cron-randomisation script min = 1 random = 1933 rmin = 0 /bin/sh: 1: root: non trouvé /bin/sh: 1: root: non trouvé /bin/sh: 1: root: non trouvé
merci @viritude. Globalement, le problème peut être résolu par la modification de /etc/crontab.
Tout cela est exact, le chemin était déjà connu. kal mentionné qu'il était /bin/bash dans son premier commentaire sur la question.
OriginalL'auteur Reid Spencer
Dans le cas où cette aide à tout le monde: pour moi, il semble que j'en avais fini avec les "DOS" les fins de ligne (CR-LF) au lieu de "unix" les fins de ligne (LF). Cela peut être vérifié à l'aide de od ou de votre favori hex dump de l'outil, par exemple:
... et regardez pour \r\n au lieu de \n.
Il me semble (et cet article le prend en charge) que le caractère CR arrête le "shebang" de travailler parce que c'est interprétée comme faisant partie de la coquille de l'exécutable de nom de fichier.
(Les fins de ligne eux-mêmes ne semblaient parce que le fichier provient d'un dépôt git et a été transféré par l'intermédiaire d'une machine Windows).
OriginalL'auteur olliehaffenden