Crontab-Syntax; Mehrere Befehle

13

Ich möchte die folgende Befehlskette als Cronjob erhalten:

* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py

Es funktioniert in der Konsole, aber ich bekomme keine Ausgabe vom Cronjob.

Ich folgte diesem Vorschlag, indem ich ihn durch ersetzte

* * * * * env > /tmp/env.output

um herauszufinden, ob env anders ist. Ich konnte nichts Relevantes finden, außer dass PATH anders war. Also habe ich mich eingerichtet

PATH=myPath
* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py

und es hat immer noch nicht funktioniert. Schließlich habe ich es durch ersetzt

PATH=myPath
* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py
* * * * * env > /tmp/env.output

und diesmal habe ich nicht einmal die env.outputDatei bekommen. Daher denke ich, dass etwas mit meiner Syntax nicht stimmt - aber es sieht genauso aus wie die Vorschläge für mehrere Befehle, die ich online gefunden habe.

Was ist hier los? Wenn es nicht offensichtlich ist, was kann ich als nächstes tun, um den Fehler aufzuspüren?

PATH=/usr/local/anaconda2/envs/myenv3/bin:~/.conda:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

out.err::

/bin/sh: 6: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
/bin/sh: 15: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
/bin/sh: 17: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
Only bash and zsh are supported
FooBar
quelle

Antworten:

16

In Ubuntu führt der cronDämon standardmäßig alle Jobs mit der Shell sh( dash) aus und dashverfügt nicht über eine integrierte sourceFunktion.

Sie müssen den POSIX-Weg verwenden, dh .:

* * * * * . activate myenv3 && cd ~/foo/bar && python sssb.py

Alternativ können Sie den Job als Argument für Folgendes ausführen bash:

* * * * * "$(command -v bash)" -c 'source activate myenv3 && cd ~/foo/bar && python sssb.py'
heemayl
quelle
Jetzt habe ich wieder eine /tmp/env.output Datei, aber immer noch keine Ausgabe von der Hauptdatei.
FooBar
1
@FooBar was ist die Ausgabe von grep SHELL /tmp/env.output? Führen Sie auch den ersten Job als aus * * * * * ( . activate myenv3 && cd ~/foo/bar && python sssb.py ) >/tmp/out.err 2>&1und überprüfen Sie den Inhalt von/tmp/out.err
heemayl
Es heißt SHELL = / bin / sh. Ich füge die Ausgabe out.errund den tatsächlichen Pfad ein, den ich in die Frage eingefügt habe.
FooBar
1
+1 für Ihre Kapselung mit $(command -v bash) -c ' ... '- löst den gesamten Tigaboo, ohne in die (nicht so) chaotischen Details zu geraten.
Cbhihe
1
Der Befehl -v Teil von "$(command -v bash)" -c '...'ist sinnlos. Tun bash -c '...'
Sie es