Syntaxe Crontab; Commandes multiples

14

Je voudrais obtenir la chaîne de commandes suivante en tant que cronjob:

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

Cela fonctionne dans la console, mais je ne reçois aucune sortie du cronjob.

J'ai suivi cette suggestion en la remplaçant par

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

pour savoir si env est différent. Je n'ai rien trouvé de pertinent à part que PATH soit différent. Alors j'ai installé

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

et cela n'a toujours pas fonctionné. Enfin je l'ai remplacé par

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

et cette fois je n'ai même pas eu le env.outputfichier. Par conséquent, je pense qu'il y a un problème avec ma syntaxe - mais cela ressemble exactement aux suggestions de commandes multiples que j'ai trouvées en ligne.

Que se passe t-il ici? Si ce n'est pas évident, que puis-je faire pour retracer l'erreur?

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
la source

Réponses:

16

Dans Ubuntu, par défaut, le crondémon exécute tous les travaux à l'aide du shell sh( dash) et dashn'a pas de fonction sourceintégrée.

Vous devez utiliser la méthode POSIX, à savoir .:

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

Vous pouvez également exécuter le travail comme argument pour bash:

* * * * * "$(command -v bash)" -c 'source activate myenv3 && cd ~/foo/bar && python sssb.py'
heemayl
la source
Maintenant, j'ai à nouveau un fichier /tmp/env.output, mais toujours aucune sortie du fichier principal.
FooBar
1
@FooBar quelle est la sortie de grep SHELL /tmp/env.output? Exécutez également le premier travail en tant que * * * * * ( . activate myenv3 && cd ~/foo/bar && python sssb.py ) >/tmp/out.err 2>&1et vérifiez le contenu de/tmp/out.err
heemayl
Il dit SHELL = / bin / sh. Je vais coller la sortie de out.erret le CHEMIN réel que j'ai collé dans la question.
FooBar
1
+1 pour votre encapsulation en utilisant $(command -v bash) -c ' ... '- résout tout le tigaboo sans entrer dans les détails (pas si) désordonnés.
Cbhihe
1
La partie -v de la commande "$(command -v bash)" -c '...'est inutile. bash -c '...'
Faites