Pregunta

Tengo un par de servidores y otros demonios que necesito para poner en marcha en la secuencia correcta.

He creado los scripts init.d del guión esqueleto, y puedo instalarlos para comenzar en la secuencia correcta mediante el sistema de nombres numerados, pero permanecen algunos problemas:

Un servidor ( 'servidorA') necesita para inicializar una conexión de base de datos, y luego escuchar en un socket. Otro servidor ( 'Servidor b'), entonces necesita conectarse a la toma de corriente, y la conexión fallará si el proceso previo aún no está escuchando. ¿Hay una manera de prevenir el guión de init.d en servidorA de la terminación de hasta servidorA ha comenzado a escuchar? El init SERVERB no comenzará hasta que el init servidorA ha terminado.

En este momento, la configuración funciona por tener SERVERB simplemente vuelva a intentar la conexión hasta que lo consiga, pero ese enfoque parece frágil. Me gustaría tener un entendimiento más determinista de cómo forzar la secuenciación.

¿Fue útil?

Solución

Sí, esta es mi pregunta que estoy respondiendo, pero he encontrado que esta técnica sea útil, y estoy compartiendo para nadie más que luchan con los mismos problemas.

he encontrado socat a ser muy útil en espera de un zócalo o puerto. Una secuencia de comandos init.d como:

case “$1″ in
  start)
  echo '--benign phrase' | socat - UNIX-CONNECT:/path/to/socket,retry=10,intervall=1
;;

esperará hasta que el agujero se hace grabable, y luego volver. No hay ninguna daemonization involucrados, por lo que bloquea la ejecución de scripts en init.d número más alto hasta que termine.

El uso de este tipo de scripts camarero se ralentizará la secuencia de arranque, y son por lo tanto no óptima, sino que son una gran mejora del enfoque muy frágil de rociar 'Sueño n' declaraciones en las secuencias de comandos.

Otros consejos

No creo que es frágil - al menos yo puedo pensar en el escenario de donde no será frágil. Tienen un tiempo de reintento de 5 segundos y no está mal del todo. su un enfoque KISS y no hay casos de esquina que no entienda.

Conseguir un entorno distribuido sincronizada no es para los débiles de corazón, y su exageración en su ejemplo.

Para darle un poco de confianza en su enfoque que yo puedo decir que tengo docenas de procesos de servidor complejas escritas a mano distribuidos sobre una tela de la finca, que nunca me han dado ninguna pena, incluso cuando los servidores de bases de datos han desaparecido, o cuando la red troncos han bajado etc. Ellos simplemente seguir funcionando en modo degradado hasta que las bases de datos regresan.

Si el servidor escucha en un socket de dominio, se podría construir un bucle que las encuestas para la toma. Puede haber una manera más fácil de hacer esto en bash, pero podría ser algo como:

for i in 1 2 3 4 5; do
  if [ -e '/var/run/myserver.sock' ]; then
    break
  fi
done

Otra solución es hacer que su servidor no daemonize hasta que se haya abierto el socket de escucha. De esta manera, el guión de inicio se detendrá hasta que los daemonizes proceso, que garantiza el zócalo esté disponible.

Por supuesto, esto depende de la aplicación que hace la daemonization en sí, en lugar de a través de otros medios. ( "/ Usr / bin / myserver &" o similar.)

Actualizado:

Tenga en cuenta también que, lo que está haciendo ahora es todo inicio al estilo System-V. Ubuntu utiliza realmente Upstart, que es un sistema basado en eventos en lugar de una secuencia de guiones. Se puede optar por el uso de puestos de trabajo advenedizos en lugar de scripts de inicio System-V y disparar un evento Upstart personalizado desde el servidor, lo que dará lugar el lanzamiento de su segundo servidor.

El Primeros guía tiene un ejemplo de iniciación de esta en la parte inferior. No sé si hay una manera de API, pero podría ser sólo una cuestión de un “sistema ( '/ bin / initctl emitir MyEvent');” en el punto correcto en el tiempo en el primer servidor. Otra persona con experiencia más Upstart puede ser capaz de elaborar una mejor / más.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top