Cron é executado, mas o script não funciona

4

Eu sei que há muitas perguntas semelhantes e eu tentei muitas coisas, mas ainda não consegui fazer funcionar.

Eu tenho cronjob que está agendado para ser executado em 10min. Eu posso ver em /var/log/syslog que ele é executado normalmente

Oct 21 07:30:01 stan CRON[7604]: (stan) CMD (stan /home/stan/update.sh)
Oct 21 07:40:01 stan CRON[8304]: (stan) CMD (stan /home/stan/update.sh)
Oct 21 07:50:01 stan CRON[8751]: (stan) CMD (stan /home/stan/update.sh)
Oct 21 08:00:01 stan CRON[9347]: (stan) CMD (stan /home/stan/update.sh)
Oct 21 08:10:01 stan CRON[9789]: (stan) CMD (stan /home/stan/update.sh)

update.sh call php script que atualiza o banco de dados. Quando eu corro diretamente do terminal, o banco de dados de shell script é atualizado e está funcionando perfeitamente

./update.sh

Mas a partir do cronjob não atualiza o banco de dados. Meu cron

*/10 * * * * stan /home/stan/update.sh

O comando produzido a partir do script de shell é

/usr/bin/php /var/www/html/site/update.php

Permissões de ambos os arquivos

-rwxrwxr-x  1 stan stan    123 Oct 20 15:09 update.sh
-rwxr-xr-x  1 stan www-data 1301 Oct 21 07:52 /var/www/html/site/update.php

Alguma ideia do que pode ser o problema?

Atualização: PATH

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

update.sh

$ cat update.sh 
#!/bin/sh

list="/var/www/html/site"
config="/usr/bin/php"

for i in "$list"
do
    "$config" "$i"/update.php
done

Referência minha pergunta de ontem que era sobre o shell e php agora é sobre cron.

$ whereis php

php: /usr/bin/php5.6 /usr/bin/php /usr/lib/php /etc/php /usr/include/php /usr/share/php5.6-intl /usr/share/php7.0-mbstring /usr/share/php7.0-common /usr/share/php5.6-curl /usr/share/php5.6-gd /usr/share/php5.6-mcrypt /usr/share/php5.6-common /usr/share/php5.6-readline /usr/share/php5.6-json /usr/share/php /usr/share/php5.5-mbstring /usr/share/php5.6-opcache /usr/share/php5.6-mbstring /usr/share/php5.6-xml /usr/share/php5.5-common /usr/share/php5.6-mysql /usr/share/man/man1/php.1.gz
$ which php
/usr/bin/php
    
por S.I. 21.10.2016 / 07:29

3 respostas

4

Você parece confundir dois métodos diferentes de invocar cron jobs.

O Ubuntu herda do Debian uma política um pouco confusa de suporte ao usuário crontabs que são armazenados em uma área de spool /var/spool/cron , e tarefas agendadas do sistema são executadas a partir de /etc/crontab e os arquivos em /etc/cron.d .

Trabalhos especificados em /etc/crontab ou via arquivos em /etc/cron.d precisam de um campo extra para permitir que eles sejam executados como um usuário diferente, então o formato é algo como

*/10 * * * * <username> <command> <args>

Os trabalhos configurados por meio da área de spool usando crontab -e (ou sudo crontab -e para raiz) já pertencem a um usuário específico e não precisam do campo de usuário

*/10 * * * * <command> <args>

Se você incluir o campo username em uma tarefa cron configurada por meio de um comando crontab -e , ele será interpretado incorretamente como um comando: como podemos ver na sua saída de log,

Oct 21 07:30:01 stan CRON[7604]: (stan) CMD (stan /home/stan/update.sh)

cron está interpretando stan como um comando com argumento /home/stan/update.sh

A solução deve ser simplesmente remover o nome de usuário stan do seu crontab.

    
por steeldriver 21.10.2016 / 15:00
2

alguns problemas possíveis:

1) Você pode não ter #!/bin/sh como primeira linha em update.sh

2) O PHP pode precisar executar comandos extras, mas os cron jobs são executados sem a variável PATH sendo definida. Para corrigir isso use echo $PATH no terminal onde o comando funciona e, em seguida, use export PATH=... , substituindo o ... pela saída de echo $PATH acima

3) O PHP pode precisar de outras variáveis de ambiente para funcionar. Rastreie-os e exporte-os em update.sh antes de chamar /usr/bin/php .

Editar

OK, não é 1)

Abra uma nova janela (ou uma nova conexão ssh) e execute:

for i in 'env | sed 's/=.*//'' ; do unset $i ; done

Isso cancelará a configuração de todas as variáveis de ambiente, incluindo o PATH. Então tente:

/usr/bin/php /var/www/html/site/update.php

Em seguida, poste aqui as mensagens de erro.

    
por sмurf 21.10.2016 / 07:40
2

O problema é a pesquisa de variável de caminho muito limitada do crontab. O caminho completo deve ser adicionado para adicionar quase todos os seus comandos em todos os seus scripts e subscritos. Ou você pode adicionar o mesmo caminho de pesquisa ao script que você tem ao executar o script manualmente.

Alterar de:

#!/bin/sh

list="/var/www/html/site"
config="/usr/bin/php"

for i in "$list"
do
    "$config" "$i"/update.php
done

Altere para:

#!/bin/sh

PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

list="/var/www/html/site"
config="/usr/bin/php"

for i in "$list"
do
    "$config" "$i"/update.php
done

Nota :

A pesquisa de caminho adicionada foi obtida a partir do que você postou na sua pergunta, que funciona ao executar o script manualmente. Se você souber qual caminho contém o comando do script junto com qualquer script ou comando chamado pelo script update.php , esses são os únicos caminhos de pesquisa que precisam ser adicionados.

    
por L. D. James 21.10.2016 / 09:35