executando um script sh do cron

11

Eu tenho um script test.sh

#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh

quando executo o arquivo como root na linha de comando, ele funciona.

sh /home/v/test.sh 

quando eu configuro para crontab -e (é o cron do root), não está funcionando

 * * * * * sh /home/v/test.sh

O que eu faço de errado? Obrigado

    
por Elzo Valugi 02.02.2011 / 15:45

3 respostas

15

De acordo com o homem:

The cron daemon starts a subshell from your HOME directory. If you schedule a command to run when you are not logged in and you want commands in your .profile file to run, the command must explicitly read your .profile file.

The cron daemon supplies a default environment for every shell, defining HOME, LOGNAME, SHELL (=/usr/bin/sh),
and PATH (=/usr/bin).

Portanto, o daemon do cron não sabe onde o php está e você deve especificar manualmente o caminho completo do php, por exemplo (não sei qual é o caminho real do PHP):

#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh

Outra forma é utilizar o / etc / profile (ou seu .profile / .bashrc), por exemplo

* * * * * . /home/v/.bashrc ; sh /home/v/test.sh

Isto é útil se o seu .bashrc definir as variáveis de ambiente que você precisa (ou seja, PATH)

EDITAR

Uma leitura interessante é " Novato: Introdução ao cron ", não desvalorize o artigo do título (é uma leitura para todos), na verdade é bem escrito completo e responde perfeitamente à sua pergunta:

...
PATH contains the directories which will be in the search path for cron e.g if you've got a program 'foo' in the directory /usr/cog/bin, it might be worth adding /usr/cog/bin to the path, as it will stop you having to use the full path to 'foo' every time you want to call it.
...

    
por 02.02.2011 / 17:03
5

Existem quatro causas comuns para os comandos que funcionam quando digitado em um terminal, mas não do cron, em ordem de ocorrência:

  1. O Cron fornece um ambiente limitado, por exemplo, um $PATH mínimo e outras variáveis esperadas ausentes.
  2. Cron invoca / bin / sh por padrão, enquanto você pode estar usando algum outro shell interativamente.
  3. Cron trata o caractere% especialmente (ele é transformado em uma nova linha no comando).
  4. O Cron não fornece um terminal ou ambiente gráfico.

Se o seu trabalho produzir alguma saída, incluindo mensagens de erro, o cron enviará um email com a saída inteira. Certifique-se de ler o e-mail recebido localmente ou encaminhá-lo para um endereço que você leu. Para encaminhar e-mails de uma conta local para outro endereço, coloque o outro endereço em ~/.forward . Se a tarefa cron estiver sendo executada como um usuário do sistema ( root , webmaster ,…), certifique-se de que o email do usuário seja redirecionado para você (e qualquer outro administrador); com a maioria das configurações de e-mail, insira linhas como root: elzo em /etc/aliases .

    
por 05.02.2011 / 01:15
2

O daemon cron geralmente executa seu comando em um shell no qual a variável de ambiente PATH é restrita a algum padrão do sistema, por exemplo, / usr / bin: / bin.

Provavelmente, o comando php não está disponível em / usr / bin ou / bin e, portanto, o script falha quando executado via cron e é executado com sucesso quando não.

O Cron geralmente relata erros ou mensagens de trabalho por um e-mail para o usuário root (ou seja, quando um comando retorna um status de saída! = 0 ou produz saída para stdout / stderr) após o término da tarefa.

Dependendo do seu sistema, você precisa configurar a entrega de mensagens locais para obter essas mensagens.

    
por 02.02.2011 / 22:55

Tags