2011-04-12 12 views
5

Mi sistema incluye una tarea que abre un socket de red, recibe datos enviados de la red, los procesa y los escribe en el disco o hace ping a otras máquinas según los mensajes. Esta tarea debe ejecutarse para siempre, y el servicio está diseñado para que esta tarea siempre se ejecute. Pero a veces se cuelga.Mantenimiento de una tarea de ejecución prolongada en Linux

¿Cuál es la mejor práctica para mantener una tarea así? Supongamos que está bien que la tarea esté muerta durante hasta 30 segundos antes de que la reiniciemos.

Algunas ideas obvias incluyen tener un proceso de vigilancia que comprueba para asegurarse de que el proceso todavía se está ejecutando. Watchdog podría activarse por cron. Pero, ¿cómo sabe si el proceso está vivo o no? Escribir un archivo pidfile touch un archivo de latido del corazón? Una solución ideal no generaría continuamente más procesos si la máquina se atasca hasta el punto en que el perro guardián funciona más rápido que el latido del corazón.

¿Hay herramientas estándar de Linux para esto? Me puedo imaginar una solución que utiliza una cola de mensajes, pero no estoy seguro de si es una buena idea o no.

+1

Votar para cambiar al superusuario, unix.se probablemente sea aún mejor. –

Respuesta

2

Dependiendo de la naturaleza de la tarea que desea supervisar, un método es escribir un envoltorio simple para iniciar su tarea en un tenedor().

La tarea contenedora puede hacer un waitpid() en el elemento secundario y reiniciarlo si se termina.

Esto depende de la modificación del origen de la tarea que desea ejecutar.

2

sysvinit reiniciará los procesos que mueren, si se agrega a inittab.

Si le preocupa que el proceso se congele sin que se bloquee y finalice el proceso, puede usar un latido del corazón y eliminar por completo la instancia activa, permitiendo que init la reinicie.

2

Puede usar monit junto con daemonize. Hay muchas herramientas para esto en el mundo * nix.

2

Supervisor fue diseñado precisamente para esta tarea. Desde el project website:

Supervisor es un sistema cliente/servidor que permite a sus usuarios monitorear y controlar una cantidad de procesos en sistemas operativos tipo UNIX.

Se ejecuta como un daemon (supervisord) controlado por una herramienta de línea de comandos, supervisorctl. El archivo de configuración contiene una lista de programas que debe monitorear, entre otras configuraciones.

El número de opciones es bastante amplio, - eche un vistazo a docs para obtener una lista completa. En su caso, la sección de configuración relevante podría ser algo como esto:

[program:my-network-task] 
command=/bin/my-network-task # where your binary lives 
autostart=true     # start when supervisor starts? 
autorestart=true    # restart automatically when stopped? 
startsecs=10     # consider start successful after how many secs? 
startretries=3     # try starting how many times? 

he utilizado Supervisor mismo y ha funcionado muy bien una vez que todo se ha configurado. Requiere Python, que no debería ser un gran problema en la mayoría de los entornos, pero podría serlo.

+0

Terminé usando supervisión. Encontré la experiencia realmente dolorosa. Muchos errores conocidos y de larga data.Está diseñado para esto, pero también lo son otros proyectos como god or monit. Ojalá hubiera elegido algo más. YMMV. – Leopd

Cuestiones relacionadas