Sintaxe do Crontab; Comandos múltiplos


13

Gostaria de obter a seguinte cadeia de comandos como cronjob:

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

Funciona no console, mas não recebo nenhuma saída do cronjob.

Eu segui essa sugestão, substituindo-a por

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

para descobrir se o env é diferente. Não consegui encontrar nada relevante além de PATH ser diferente. Então eu montei

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

e ainda não funcionou. Finalmente substituí-o por

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

e desta vez nem consegui o env.outputarquivo. Por isso, acho que há algo errado com a minha sintaxe - mas parece exatamente com as sugestões de vários comandos que encontrei online.

O que está acontecendo aqui? Se não for óbvio, o que posso seguir para rastrear o erro?

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

Respostas:


16

No Ubuntu, por padrão, o crondaemon executa todos os trabalhos usando o shell sh( dash) e dashnão possui um sourcebuiltin.

Você precisa usar a maneira POSIX, ou seja .:

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

Como alternativa, você pode executar o trabalho como argumento para bash:

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

Agora eu tenho um arquivo /tmp/env.output novamente, mas ainda não tenho saída do arquivo principal.
FooBar

11
@FooBar, qual é o resultado grep SHELL /tmp/env.output? Execute também o primeiro trabalho como * * * * * ( . activate myenv3 && cd ~/foo/bar && python sssb.py ) >/tmp/out.err 2>&1e verifique o conteúdo de/tmp/out.err
heemayl

Diz SHELL = / bin / sh. Vou colar a saída out.erre o PATH real que colei na pergunta.
FooBar

11
+1 para o seu encapsulamento usando $(command -v bash) -c ' ... '- resolve todo o tigaboo sem entrar nos detalhes (nem tanto) confusos.
Cbhihe #

11
A parte do comando -v "$(command -v bash)" -c '...'é inútil. Apenas façabash -c '...'
geirha
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.