Issue Usando Crontab para Criar / Reiniciar Tela e Executar Comando

1

Eu quero ter um determinado script (tarefa rake rails) em execução no meu servidor em todos os momentos - ele basicamente preenche meu banco de dados usando um feed ao vivo. Eu posso criar uma tela ( link ) e executar a tarefa facilmente, mas eu gostaria de automatizá-la caso ele falha ou para (sempre que eu implantar na produção, ele para).

Eu criei um script que faz isso perfeitamente:

# my_script

#!/bin/bash

start_myscreen () {
    screen -dmS myscreen bash -c 'cd /var/app/current/; rake my_task RAILS_ENV=production'
}

if screen -list | grep -q "No Sockets found"; then
  echo "no screens available"
  echo "starting myscreen"
  start_myscreen
else
  echo "screens available!"
  if screen -list | grep -q "myscreen"; then
    echo "myscreen exists - restarting"
    screen -X -S myscreen quit  
  else
    echo "myscreen does NOT exist - creating now"
  fi
  start_myscreen
  echo "Finished!"
fi

Ele é projetado para que, não importa o que, a tela "myscreen" seja iniciada com a tarefa de rake iniciada no momento em que o script terminar. Obviamente na produção eu não estarei executando o script a cada minuto, isso é atualmente apenas para testes. Este script funciona perfeitamente quando executado a partir do terminal via:

./my-script

O problema ocorre quando eu o executo usando este crontab muito simples:

* * * * * ./my-script

O que é estranho é que o script está exibindo tudo corretamente (com base na mensagem enviada para mim pelo correio do crontab), mas não vejo nenhuma tela em execução depois que o cron é executado quando executo:

screen -list

Muito estranho.

BTW - o servidor executa o Amazon Linux de 64 bits (eu acredito em vermelho)

Obrigado por qualquer ajuda.

    
por user3386826 19.05.2015 / 23:13

1 resposta

1

Primeiro, observe que o diretório atual em um crontab é seu diretório inicial. Você deve colocar o caminho completo para o script no crontab. No entanto, como o seu script está sendo executado, esse não é o problema.

O provável problema é que o seu script requer uma variável de ambiente que esteja configurada na sua sessão normal. As tarefas do Cron são executadas com um ambiente mínimo, seu .profile não está carregado.

Em muitos sistemas, ~/.pam_environment é lido até mesmo para tarefas agendadas. Note que este não é um script de shell, ~/.pam_environment suporta apenas uma sintaxe restrita .

Se você não pode usar .pam_environment , você pode ter .profile lido explicitamente:

 * * * * * . ~/.profile && ./my-script

Você não está vendo nenhum erro porque eles são emitidos dentro da janela da tela e a tela é fechada imediatamente depois. Adicione a opção -L à sua invocação de screen e, de preferência, uma diretiva logfile ao seu .screenrc , para fazer com que a tela registre a saída do rake, caso esse tipo de coisa aconteça.

    
por 19.05.2015 / 23:58