Eu gostaria de configurar uma tarefa cron usando crontab -e
.
Este trabalho precisa ser executado como root, então pensei que simplesmente adicionar uma entrada em sudo crontab -e
teria sido suficiente. Infelizmente não é.
O script que preciso executar funciona bem se eu digitar diretamente:
sudo /home/user/./script.sh
Estou logado na máquina como o usuário user
, e minha entrada crontab ( sudo crontab -e
) é como a seguinte:
*/1 * * * * /home/user/./script.sh
Então, o que sinto falta aqui? Tenho a sensação de que o problema está relacionado com o direito do usuário atual ou algo assim.
Primeiro, consegui me livrar da necessidade de ser root para executar o script. Meu crontab
entry (um clássico crontab -e
desde que eu não preciso mais ser root) é executado a cada minuto e é:
* * * * * /home/user/script.sh
Meu script.sh
:
#!/bin/bash
set -e
# Other stuff
Mais uma vez, funciona quando se escreve manualmente ./script.sh
, mas não a partir do trabalho cron criado.
Eu sei que tenho a prova de que o script é executado pelo cron job. Eu redirecionei o erro em um arquivo como recomendado no comentário e recebi o seguinte erro:
python: can't open file 'get-status.py': [Errno 2] No such file or directory
Para explicar isso, em um ponto no meu script.sh
, eu uso o docker para executar outro script:
docker run -v $PWD:/t -w /t [image] [command] get-status.py
que, novamente, funciona manualmente ( ./script.sh
), mas não do trabalho cron .
Então, encontrei o problema:
docker run -v $PWD:/t [...]
copia o conteúdo do diretório atual para o contêiner docker. Como ele é executado a partir do cron job, o diretório atual obviamente não é o bom, portanto, a exceção file not found
.
Acho muito feio fazer algo como docker run -v /home/user/:/t [...]
, haveria alguma outra maneira?
Solução
Embora esta questão esteja marcada como duplicada, não é o mesmo problema.
Eu tenho um problema de PATH
dentro do meu script e tive que modificá-lo, uma vez que ele é acionado por uma tarefa cron que tomou o caminho $PWD
do script.
Veja minha própria resposta.