executando um script sh a partir do cron

12

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 configurá-lo para crontab -e (é o cron cron), não está funcionando

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

O que eu faço de errado? obrigado

Elzo Valugi
fonte
"não está funcionando" não está funcionando. Vejo? Você não sabe o que quero dizer e, da mesma forma, não sabemos o que você quer dizer. Quero dizer (sim) o que não está funcionando? Poderia ser sobre qualquer coisa. Pode ser que o palpite de tmow esteja correto, mas é apenas um palpite (e muito bom, eu acho, mas ainda assim).
Jürgen A. Erhard
Sim, se você puder ser mais específico com os resultados que está vendo, poderemos determinar melhor qual é o problema. Ou seja, o que você quer dizer com "não está funcionando" (:
gabe.
Eu não vejo nenhum log no syslog, e os scripts estão inserindo em um db o que não está acontecendo, e eles acontecem se eu executar o script manualmente.
Elzo Valugi

Respostas:

15

De acordo com o homem:

O daemon cron inicia um subshell a partir do diretório HOME. Se você agendar um comando para execução quando não estiver conectado e desejar que os comandos no seu arquivo .profile sejam executados, o comando deverá ler explicitamente o arquivo .profile.

O daemon cron fornece um ambiente padrão para cada shell, definindo HOME, LOGNAME, SHELL (= / usr / bin / sh)
e PATH (= / usr / bin).

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

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

Outra maneira é obter o / etc / profile (ou seu .profile / .bashrc), por exemplo

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

Isso é útil se o seu .bashrc definir as variáveis ​​de ambiente necessárias (por exemplo, PATH)

EDITAR

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

...
PATH contém os diretórios que estarão no caminho de busca do cron, por exemplo, se você tiver um programa 'foo' no diretório / usr / cog / bin, pode valer a pena adicionar / usr / cog / bin ao diretório path, pois ele impedirá que você use o caminho completo para 'foo' toda vez que quiser chamá-lo.
...

tmow
fonte
$ PATH incorreto é a causa mais comum de scripts que funcionam manualmente, mas não do cron.
224 Patrick Patrick
@ Patrick Claro que é um problema se o cron não souber onde está o php, caso contrário, o Elzo crontab funcionaria sem problemas, DEVE ser um problema de PATH.
tmow
Muito obrigado pela sua resposta. Funcionou para mim com muita facilidade !!! .. Muito obrigado @tmow.
Vignesh Prajapati
5

Existem quatro causas comuns para os comandos que funcionam quando digitados em um terminal, mas não no cron, em ordem comum:

  1. O Cron fornece um ambiente limitado, por exemplo, um número mínimo $PATHe outras variáveis ​​esperadas ausentes.
  2. O Cron chama / 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 ambiente terminal ou gráfico.

Se seu trabalho produzir alguma saída, incluindo mensagens de erro, o cron enviará um email com toda a saída. Leia o e-mail que você recebe localmente ou encaminhe-o para um endereço que você lê. Para encaminhar mensagens de uma conta local para outro endereço, insira o outro endereço ~/.forward. Se o trabalho cron está sendo executado como um usuário do sistema ( root, webmaster...), certifique-se que o correio do usuário é redirecionado para você (e qualquer outro admin); com a maioria das configurações de email, colocar linhas como root: elzoem /etc/aliases.

Gilles 'SO- parar de ser mau'
fonte
2

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

Provavelmente, seu phpcomando não está disponível em / usr / bin ou / bin e, portanto, o script falha quando executado via cron e executa com êxito quando não está.

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

Dependendo do seu sistema, você precisa configurar a entrega de correio local para receber essas mensagens.

maxschlepzig
fonte