Cronjobs do centos para o Ubuntu, tendo dificuldade

0

Estou mudando meus servidores vps do centos para o ubuntu. Por causa da comunidade (jeej minha primeira pergunta para essa comunidade).

Eu tenho cronjobs funcionando perfeitamente no meu centos vps assim:

01 22 * * * source /home/crawler2/env/bin/activate && cd /home/crawler2/project_spiderrooy && scrapy crawl spiderrooy > /home/crawler2/logs/spiderrooy_log_$(date '+\%Y-\%m-\%d').txt 2>&1

Tentei isso lixo no meu ubuntu vps, mas isso não funcionou. Encontre um trecho on-line (aqui em algum lugar que o bash e o dash funcionam de maneira diferente, então tentei isso:

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'

também não funciona, tentou sem escrever o log e ainda não funciona. Os comandos funcionam manualmente.

sudo grep CRON / var / log / 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')
Jan 13 12:11:01 crawler2 CRON[2905]: (CRON) info (No MTA installed, discarding output)

Com todas as minhas variações eu nunca obtenho o arquivo de log gravado, ou o comando executado, mesmo sem a gravação de log do logwrite sem a data.

A questão, como faço para rodar este centos cron no Ubuntu, com a data de logwrite, e como eu paro a porcaria do No MTA?

Obrigado.

    
por user9108711 13.01.2018 / 12:28

2 respostas

0

Você deve executar qualquer comando após $(command -v bash) como bash ( bash -c ... ), caso contrário, a coisa toda seria tratada como arquivo (s) a ser interpretado por bash .

Faça:

"$(command -v bash)" -c 'source ...'

Então, em crontab :

01 22 * * * "$(command -v bash)" -c 'source ...'
    
por heemayl 13.01.2018 / 12:45
1

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.

    
por steeldriver 13.01.2018 / 16:44