Script com curl funciona manualmente, mas não no cron job

2

Meu script (status.sh) é:

#!/bin/bash
SITE=http://www.example.org/

STATUS=$(/usr/bin/curl -s -o /dev/null -I -w "%{http_code}" $SITE)

if [ $STATUS -eq 200 ]
then
 echo $STATUS >> /home/myuser/mysite-up.log
else
 echo $STATUS >> /home/myuser/mysite-down.log
fi

Eu corro:

$ chmod +x /home/myuser/status.sh

Então, no meu crontab eu consegui:

* * * * * /home/myuser/status.sh

Quando eu corro:

$ /home/myuser/status.sh

O arquivo /home/myuser/mysite-up.log contém:

200

Mas quando o cron executa, o arquivo /home/myuser/mysite-up.log contém:

000

O que estou fazendo de errado?

EDITAR: Eu modifiquei o script adicionando:

set -x

como @Sobrique sugeriu e eu a saída é:

 SITE=http://www.example.org/
 /usr/bin/curl -s -o /dev/null -I -w '%{http_code}' http://www.example.org/
 STATUS=000
 '[' 000 -eq 200 ']'
 echo 000
    
por rpayanm 13.08.2015 / 18:11

1 resposta

7

A principal diferença entre executar um script na linha de comando e executá-lo no cron é o ambiente. Se você obtiver um comportamento diferente, verifique se esse comportamento pode ser devido a variáveis de ambiente. As tarefas Cron são executadas com apenas algumas variáveis configuradas, e aquelas não necessariamente com o mesmo valor que em uma sessão com login efetuado (em especial, PATH é geralmente diferente).

Se você deseja que suas variáveis de ambiente sejam definidas, declare-as em ~/.pam_environment (se o seu sistema suportar) ou adicione . ~/.profile && no início da tarefa cron (se as declarar em .profile ). Veja também Qual é o melhor maneira de distro / agnóstico de shell para definir variáveis de ambiente?

Nesse caso, um status 000 da curvatura indica que não foi possível se conectar ao servidor. Normalmente, a conexão de rede é em todo o sistema, então o comportamento da rede é o mesmo no cron. No entanto, uma coisa que é indicada por variáveis de ambiente é qualquer uso de proxy. Se você precisar de um proxy para se conectar à web e tiver definido a variável de ambiente http_proxy em um script de inicialização de sessão, essa configuração não será aplicada em sua tarefa cron, o que explicaria a falha.

Adicione a opção -S a você curl invocação para exibir mensagens de erro (mantendo -s para ocultar outras mensagens).

    
por 14.08.2015 / 20:07

Tags