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


"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.
...


$ 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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.