Sintassi di Crontab; Comandi multipli


14

Vorrei ottenere la seguente catena di comandi come cronjob:

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

Funziona in console, ma non ottengo alcun output dal cronjob.

Ho seguito questo suggerimento, sostituendolo con

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

per scoprire se env è diverso. Non sono riuscito a trovare nulla di rilevante oltre a PATH essere diverso. Quindi ho creato

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

e ancora non ha funzionato. Alla fine l'ho sostituito con

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

e questa volta non ho nemmeno ricevuto il env.outputfile. Quindi penso che ci sia qualcosa di sbagliato nella mia sintassi, ma sembra esattamente come i suggerimenti multi-comando che ho trovato online.

Cosa sta succedendo qui? Se non è ovvio, cosa posso fare per rintracciare l'errore?

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

Risposte:


16

In Ubuntu, per impostazione predefinita, il crondemone esegue tutti i lavori usando la shell sh( dash) e dashnon ha sourceincorporato.

È necessario utilizzare il modo POSIX, ovvero .:

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

In alternativa, è possibile eseguire il lavoro come argomento per bash:

* * * * * "$(command -v bash)" -c 'source activate myenv3 && cd ~/foo/bar && python sssb.py'

Ora ho di nuovo un file /tmp/env.output, ma ancora nessun output dal file principale.
FooBar

1
@FooBar qual è l'output di grep SHELL /tmp/env.output? * * * * * ( . activate myenv3 && cd ~/foo/bar && python sssb.py ) >/tmp/out.err 2>&1/tmp/out.err
Esegui

Dice SHELL = / bin / sh. Incollerò l'output out.erre l'effettivo PERCORSO che ho incollato nella domanda.
FooBar

1
+1 per l'incapsulamento usando $(command -v bash) -c ' ... '- risolve l'intero tigaboo senza entrare nei dettagli (non così) disordinati.
Cbhihe,

1
Il comando -v parte di "$(command -v bash)" -c '...'è inutile. Basta farebash -c '...'
geirha,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.