Acabei de executar os comandos em uma única linha crontab com & & e dentro de uma instrução bash -l -c, está funcionando agora!
Eu recentemente adquiri um novo ambiente DigitalOcean LEMP com o Ubuntu. Eu tentei criar um script SH que usa o CasperJS para coletar dados de um site externo para um arquivo JSON e um script PHP para analisar o JSON e atualizar um banco de dados MySQL. O SH é executado por um cron job. Meu crontab é o seguinte, destinado a ser executado a cada 90 minutos.
# m h dom mon dow command
0 0,3,6,9,12,15,18,21 * * * /bin/sh /usr/share/nginx/private/mpd_calls_for_service/scrape_mpd_calls_cron.sh
30 1,4,7,10,13,16,19,22 * * * /bin/sh /usr/share/nginx/private/mpd_calls_for_service/scrape_mpd_calls_cron.sh
E o arquivo SH em questão é.
#!/bin/sh
/usr/local/bin/casperjs /usr/share/nginx/private/mpd_calls_for_service/scrape_mpd_calls.js
/usr/bin/php /usr/share/nginx/private/mpd_calls_for_service/parse_json_file.php
A execução dessas linhas de código individualmente via Terminal no SSH funciona bem. No entanto, ao executar o script de shell manualmente via SSH ou o Cron, esse é o resultado.
Unable to open file: /usr/share/nginx/private/mpd_calls_for_service/scrape_mpd_calls.js Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file:///usr/local/lib/node_modules/casperjs/bin/bootstrap.js. Domains, protocols and ports must match.
Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file:///usr/local/lib/node_modules/casperjs/bin/bootstrap.js. Domains, protocols and ports must match.
Could not open input file: /usr/share/nginx/private/mpd_calls_for_service/parse_json_file.php
As soluções que experimentei nos últimos dois dias incluíram
Depois de várias tentativas, estou em um beco sem saída e pronto para começar a arrancar meu cabelo. Qualquer assistência da comunidade seria apreciada.
Eu tive que descobrir isso também, mas pelo menos a execução de casperjs requer que você tenha variáveis disponíveis que são carregadas quando você carrega um shell como um shell de login. No meu caso, eu não senti como codificar o caminho para o casperJS no meu script porque ele já estava definido no $ PATH no meu mashine. Isso levou à descoberta de que apenas gerar um shell do crontab (ou, no meu caso, ANT) não carrega os arquivos .rc, portanto, não havia caminho. Além disso, o casperJS pode requerer ainda mais variáveis que são fornecidas em um shell de login. então bash -l -c
é o caminho a percorrer para carregar o bash como um shell de login.
Tags bash cron shell ubuntu shell-script