A questão subjacente é que source
é um Bashism - que é um problema no Ubuntu porque o shell padrão para cron
é /bin/sh
- e isso resolve para o dash
shell.
A melhor maneira de lidar com isso depende de vários fatores IMHO. A correção que você encontrou em outro lugar usando command -v bash
para executar seu comando explicitamente com o shell bash (totalmente qualificado) é uma opção (embora, conforme observado em resposta do heemayl , você perdeu o -c
antes da string de comando; baseado na entrada do syslog
Jan 13 12:11:01 crawler2 CRON[2906]: (crawler2) CMD (-v bash)" 'source /home/crawler2/env/bin/activate && cd /home/crawler2/project_spiderahridderkerk && scrapy crawl spiderahridderkerk')
na verdade parece mais parecido com a entrada do seu crontab
01 22 * * * "($command -v bash)" source /home/crawler1/env/bin/activate && cd /home/crawler1/project_spiderrooy && scrapy crawl spiderrooy > /home/crawler1/online/flask/static/logs/spiderrooy_log_$(date '+\%Y-\%m-\%d').txt 2>&1'
tal que ($command -v bash)
expandiu para ( -v bash)
, que tentou executar -v bash
em uma subshell, em vez de executar command -v bash
dentro de uma substituição de comando).
Na prática, é improvável (dado o argumento padrão bastante restrito do cron) que bash
puro resolverá algo diferente de $(command -v bash)
, então IMHO bash -c '. . .'
ou /bin/bash -c '. . .'
também seria aceitável.
Nos comentários, você observou que sua própria solução era adicionar SHELL=/bin/bash
- pessoalmente, não tenho nenhum problema com isso: se você está preocupado com a sobrecarga de bash versus dash, você sempre pode limitar o escopo a uma entrada específica ou grupo de entradas, por exemplo,
# default shell
*/3 * * * * /bin/echo "Job 1 run with \$SHELL=$SHELL" >> $HOME/crontab.log
SHELL=/bin/bash
*/5 * * * * /bin/echo "Job 2 run with \$SHELL=$SHELL" >> $HOME/crontab.log
SHELL=/bin/sh
*/7 * * * * /bin/echo "Job 3 run with \$SHELL=$SHELL" >> $HOME/crontab.log
resulta em
$ tail -f ~/crontab.log
Job 1 run with $SHELL=/bin/sh
Job 3 run with $SHELL=/bin/sh
Job 2 run with $SHELL=/bin/bash
Job 1 run with $SHELL=/bin/sh
Job 1 run with $SHELL=/bin/sh
Job 2 run with $SHELL=/bin/bash
Job 3 run with $SHELL=/bin/sh
Finalmente, se /home/crawler1/env/bin/activate
é de fato um script POSIX (ou pode ser feito de forma relativamente fácil) e os comandos restantes em seu trabalho são executáveis binários ou scripts com suas próprias linhas shebang válidas, então você pode simplesmente alterar o Comando source
ao seu equivalente em POSIX .
, de forma que tudo seja executado no padrão dash
shell.