¿Cómo me aseguro de que se esté ejecutando un proceso, incluso si se mata a sí mismo? (necesita ser reiniciado entonces)

2

Estoy usando Linux. Quiero que se ejecute un proceso (un bot de irc) cada vez que inicio la computadora. Pero tengo un problema: la red es mala y se desconecta a menudo, así que necesito reiniciar manualmente el bot unas cuantas veces al día. ¿Cómo puedo automatizar eso?

Información Adicional: El bot crea un archivo pid, llamado bot.pid El bot se reconecta solo, pero solo unas pocas veces. La red es demasiado mala, por lo que el bot se mata a veces porque no obtiene respuesta.

Lo que hago actualmente (también conocido como mi enfoque;)) Tengo un trabajo cron en ejecución startbot.rb cada 5 minutos (El script en sí está en el mismo directorio que el bot)

La secuencia de comandos:

#!/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

Lo que esto hace: Comprueba si existe el archivo pid, si eso es cierto, comprueba si kill -s 0 BOT_PID == 1 (si el bot se está ejecutando) e inicia el bot si una de las dos comprobaciones falla / no es verdadera.

Mi enfoque parece ser bastante sucio, entonces, ¿cómo lo hago mejor?

le_me
fuente
Monit puede ser una utilidad muy útil para cosas como esta. La configuración tampoco es onerosa. Aquí: mmonit.com/monit/documentation/monit.html y aquí: mmonit.com/wiki/Monit/ConfigurationExamples
thisfeller
Además, eche un vistazo a swatch y dwatch. Son demonios de reloj que pueden hacer una variedad de cosas cuando se detiene un proceso. Incluso pueden reiniciar la máquina en algunas circunstancias.
Ian Atkin
Parece que es posible que desee utilizar el Proceso clase para ayudarte a manejar los procesos de tu hijo.
vgoff
ok thx, hice algo similar: escribí un script de bucle rápido que ejecuta mi script tan pronto como se cierra, lo que hace tan pronto como el bot se suicida;)
le_me

Respuestas:

1

Crucé mi pregunta en stackoverflow.com, donde obtuve la respuesta;)

https://stackoverflow.com/a/13627784/1081936

Reiniciar una aplicación es una mala solución, no una solución.

Recomiendo revisar la documentación de tu bot, buscar una opción.   para configurar después de cuántos reintentos incorrectos sale o cómo deshabilitar   Esta funcionalidad completamente. Si el bot es de código abierto, también puedes   revise su código fuente y modifique el código de reintento. Tratar de encontrar una limpia   solución.

Si realmente quieres reiniciarlo, crearía un script de shell que ejecute el bot en un bucle. asegúrese de que bot.rb no se bifurca en el fondo:

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

puedes ejecutar ese script con nohup ./startscript.sh & asi lo hace   No termina si cierra la consola.

le_me
fuente
gracias por el recordatorio, no pude aceptarlo de inmediato porque no tenía suficiente reputación: P
le_me