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.