Kann nicht ausgeführt bash-Skript aus der crontab, wenn es funktioniert von der Kommandozeile bash
Ich habe ein seltsames problem, um in der Lage zu laufen ein bash-Skript von der Kommandozeile aber nicht aus der crontab-Eintrag für root. Ich bin mit 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
Wenn ich das Skript aus der cmd-line bash verwenden, es funktioniert gut, aber sh
scheitert mit folgenden Fehler:
> jmeter-cron-randomise.sh: 7: jmeter-cron-randomise.sh: arithmetic
> expression: expecting primary: " % 1 "
Haben gegoogelt, das problem scheint die standard-shell nicht den gleichen mathematischen Operatoren, wie % (modulo), als bash. Ich bin mir Nicht sicher, warum der cron-job nicht das Skript? Ich gehe davon aus, dass es ist, weil es nicht mit der bash-shell? Es ist definitiv gefeuert zu werden, von der cron-daemon (sehen Sie in /var/log/syslog). Jede Hilfe sehr geschätzt.
Was ist deine shebang-Zeile?
seine #!/bin/bash
Hat Ihr
Wie es aussieht, läuft sh. Wie kann ich erzwingen, führen Sie die bash-abgesehen von der shebang-Zeile?
kal: laufen
seine #!/bin/bash
Hat Ihr
cron
führen Sie den Befehl mit /bin/sh
? Es sieht aus wie es wahrscheinlich ist, weil der Fehler ist, was Sie möchten erhalten, wenn Sie die Ausführung des Skripts mit sh
statt bash
(wie in: sh /home/…/jmeter-cron-randomise.sh
). Und auf Ubuntu /bin/sh
ist oft dash
, nicht bash
. Zu beheben, verwenden Sie bash /home/…/jmeter-cron-dandomise.sh >> …
in Ihre crontab-Eintrag.Wie es aussieht, läuft sh. Wie kann ich erzwingen, führen Sie die bash-abgesehen von der shebang-Zeile?
kal: laufen
bash /path/of/script.sh
. Diese bash
sollte die Ausgabe von which bash
, das ist der vollständige Pfad der binären.InformationsquelleAutor kal | 2014-10-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie wahrscheinlich zu sagen, cron, dass die Schale zu verwenden ist die bash-shell Standard sh. Sie können tun, dass für alle crontab-Einträge, indem Sie diese Zeile in Ihre crontab ein:
Beachten Sie, dass dies bewirken, dass alle Scripte in die crontab ausgeführt werden, unter bash, das kann nicht sein, was Sie wollen. Wenn Sie möchten, ändern Sie die crontab-Zeile selbst zu laufen, nur bash, ändert es so um:
Hinweis, dass ich auch verursacht stderr geschrieben werden, zu der cron.log-Datei (2>&1), die möglicherweise nicht das sein, was Sie wollen, aber ist ziemlich gängige Praxis. Dies kann dabei helfen, weitere diagnose-Fehler aus dem Skript.
/bin/bash
oder kann es sein/usr/bin/bash
oder was auch immer. Es ist interessant zu erwähnen, dass die echten vollen Pfad kann man mitwhich bash
.danke. das zurücksetzen auf die Verwendung der crontab Eintrag mittels crontab -e bei root-Benutzer und mit Blick auf das ursprüngliche problem, das ich sehen kann hilfreiche Fehlermeldungen jetzt ------ Laufen die jmeter-cron-randomiser script, min = 1, random = 1933 rmin = 0 /bin/sh: 1: root: not found /bin/sh: 1: root: not found /bin/sh: 1: root: not found
danke @viritude. Insgesamt problem gelöst, über editieren der /etc/crontab.
Das ist zwar richtig, der Weg war schon bekannt. kal erwähnt war es /bin/bash in seinem ersten Kommentar auf die Frage.
InformationsquelleAutor Reid Spencer
In diesem Fall hilft allen: für mich zu sein schien, denn ich hatte, landete mit "DOS" Zeilenenden (CR-LF) statt unix Zeilenenden (LF). Dies kann überprüft werden mit od oder in Ihrem Lieblings-hex-dump-tool, z.B.:
... und suchen für \r\n anstelle von nur \n.
Scheint es (und dieser Artikel unterstützt), dass die CR-Zeichen beendet den "shebang", da es interpretiert wird als Teil der shell ausführbare Datei mit dem Namen.
(Die Zeilenenden selbst erschien, da die Datei kam von einem git-repository und übertragen wurde, über eine Windows-Maschine).
InformationsquelleAutor olliehaffenden