Pergunta

Eu tenho um script Rails que eu gostaria de executar diariamente. Eu sei que há muitas abordagens, e que uma abordagem script/runner cron'd é desaprovada por alguns, mas parece satisfazer as minhas necessidades.

No entanto, o meu script não está sendo executado como previsto.

Meu aplicativo vive em /data/myapp/current, eo roteiro está em script/myscript.rb. I pode executá-lo manualmente sem problema como root com:

/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb

Quando eu fizer isso, o arquivo de log especial (log/myscript.log) é registrado como esperado:

Tue Mar 03 13:16:00 -0500 2009 Starting to execute script...
...
Tue Mar 03 13:19:08 -0500 2009 Finished executing script in 188.075028 seconds

eu tenho isso definido para ser executado com cron todas as manhãs às 4:00. crontab do root:

$ crontab -l
0 4 * * * /data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb

Na verdade, parece que ele tentou correr tão recentemente como esta manhã!

$ tail -100 /var/log/cron
...
Mar  2 04:00:01 hostname crond[8894]: (root) CMD (/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb)
...
Mar  3 04:00:01 hostname crond[22398]: (root) CMD (/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb)
...

No entanto, não há nenhuma entrada no meu arquivo de log e os dados que ele deve atualizar não foi sendo atualizado. As permissões de arquivo de log (como um teste) foram ainda definidas para globalmente gravável:

$ ls -lh
total 19M
...
-rw-rw-rw- 1 myuser apps 7.4K Mar  3 13:19 myscript.log
...

Estou rodando em CentOS 5.

Então, minhas perguntas são ...

  1. Onde posso procurar informações para depurar isso?
  2. Poderia esta ser uma questão SELinux? Existe um contexto de segurança que eu poderia definir ou alteração que possa resolver esse erro?

Obrigado!

Atualizar

Obrigado a Paulo e Lucas ambos. Ele tinha vir a ser um problema ambiental, e capturando a stderr para um arquivo de log me permitiu encontrar o erro.

$ cat cron.log 
/usr/bin/env: ruby: No such file or directory

$ head /data/myapp/current/script/runner 
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/boot'
require 'commands/runner'

Adicionando o específico do rubi executável para o comando fez o truque:

$ crontab -l
0 4 * * * /usr/local/bin/ruby /data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb >> /data/myapp/current/log/cron.log 2>&1
Foi útil?

Solução

Por mails cron padrão sua saída para o usuário que ele correu. Você poderia olhar lá.

É muito útil para redirecionar a saída dos scripts são executados pelo cron para que você possa olhar para os resultados em um arquivo de log em vez de correio local de algum usuário aleatório no servidor.

Veja como você seria redirecionar stdout e stderr para um arquivo de log:

cd /home/deploy/your_app/current; script/runner -e production ./script/my_cron_job.rb >> /home/deploy/your_app/current/log/my_file.log 2>&1

O stdout >> redirecionamento para um arquivo e, e os redirecionamentos 2>&1 stderr para stdout assim quaisquer mensagens de erro será registrada também.

Depois de ter feito isso, você será capaz de examinar as mensagens de erro para ver o que está realmente acontecendo.

Outras dicas

O problema habitual quando descobre alguém seu script não será executado em um trabalho cron quando ele será executado a partir da linha de comando é que ele se baseia em alguma parte do ambiente que uma sessão interativa tem mas cron não recebe. Alguns candidatos frequentes são o ambiente "PATH" e, possivelmente, "HOME".

No Linux, verifique se todos os arquivos de configuração (/ etc / crontab, /etc/crond.{daily,hourly,etc}/* e /etc/cron.d/*) são apenas gravável para o usuário root e são não links simbólicos, caso contrário eles não vão mesmo ser considerado.

Para permitir que não-root e / ou links simbólicos, especifique a opção -p para o daemon crond.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top