Como asseguro que um processo está sendo executado, mesmo se ele se mata? (precisa ser reiniciado)

2

Estou usando o linux. Eu quero que um processo (um irc bot) seja executado toda vez que eu iniciar o computador. Mas eu tenho um problema: a rede é ruim e se desconecta com freqüência, então eu preciso reiniciar manualmente o bot algumas vezes por dia. Como faço para automatizar isso?

Informação adicional: O bot cria um arquivo pid chamado bot.pid O bot se reconecta, mas apenas algumas vezes. A rede é muito ruim, então o bot se mata às vezes porque não recebe resposta.

O que eu faço atualmente (também conhecido como minha abordagem;)) Eu tenho um cron job executando startbot.rb a cada 5 minutos. (O script em si está no mesmo diretório que o bot)

O script:

#!/usr/bin/ruby
require 'fileutils'

if File.exists?(File.expand_path('tmp/bot.pid'))
  @pid = File.read(File.expand_path('tmp/bot.pid')).chomp!.to_i
  begin
    raise "ouch" if Process.kill(0, @pid) != 1
  rescue
    puts "Removing abandoned pid file"
    FileUtils.rm(File.expand_path('tmp/bot.pid'))
    puts "Starting the bot!"
    Kernel.exec(File.expand_path('./bot.rb'))
  else
    puts "Bot up and running!"
  end
else
  puts "Starting the bot!"
  Kernel.exec(File.expand_path('./bot.rb'))
end

O que isso faz: Ele verifica se o arquivo pid existe, se isso é verdade, ele verifica se kill -s 0 BOT_PID == 1 (se o bot está sendo executado) e inicia o bot se uma das duas verificações falhar / não for verdadeira.

Minha abordagem parece estar bastante suja, então como faço melhor?

    
por le_me 29.11.2012 / 14:57

1 resposta

1

Eu fiz uma postagem cruzada da minha pergunta para stackoverflow.com, onde recebi a resposta;)

link

Restarting a application is a bad workaround, not a solution.

i recommend to review the documentation of your bot, look for a option to configure after how many bad retries it exits or how to disable this functionality completely. if the bot is open source, you can also review its source code and modify the retry code. Try to find a clean solution.

if you really want to restart it, i would create a shellscript that runs the bot in a loop. make sure bot.rb does not fork into the background:

#/bin/bash
for (( ; ; ))
do
     ./bot.rb
done

you can run that script with nohup ./startscript.sh & so it does not terminate if you close the console.

    
por 30.11.2012 / 08:51