Tengo un programa para el que estoy escribiendo un script en /etc/init.d .
El problema es que el programa no se demoniza a sí mismo . Se tarda como 5 segundos en iniciarlo y, cuando se ha inicializado, imprime una cadena ("Iniciado correctamente") en la salida estándar.
Estoy buscando crear una secuencia de comandos que inicie el proceso, espere un momento a que aparezca la cadena y luego continúe con la secuencia de comandos, lo que indica falla o éxito (se encontró la cadena).
Obviamente esto no funciona como yo quiero.
daemon $PROGRAM &Bastante
(./proc > some_output) & poll_output_for "Started OK" 10 secs or dieCreo que podría usar expect para hacer algo como esto: consulte http://expect.sourceforge.net/ o http://en.wikipedia.org/wiki/Expect . Esto está en repositorios para muchas distribuciones, por ejemplo, en Ubuntu puede apt-get install expect .
Es un script para simular tu daemon:
#/usr/bin/env /bin/bash # daemon.sh sleep 2 echo Started OK while :; do sleep 1; echo '.' >> daemon.log; done... y aquí hay un script de expectativa que espera la salida y luego sale:
#!/usr/bin/env /usr/bin/expect spawn -ignore SIGHUP ./daemon.sh expect "Started OK" Expect no regresa hasta que llega la notificación "Comenzó correctamente". Cuando se cierra, el daemon obtiene un SIGHUP , pero lo ignoramos para que continúe ejecutándose. Si inspecciona el archivo de registro ( watch cat daemon.log ), el demonio debería estar funcionando.
No creo que sea demasiado difícil esperar que devuelva un código de error apropiado; eche un vistazo a la página de manual para obtener más información.
Si te entiendo, hay un programa que tarda unos 5 segundos en iniciarse, pero se ejecuta en segundo plano. Debe esperar a que se inicie este programa, y este programa seguirá imprimiendo "Iniciado correctamente".
Si este programa se inicia, se ejecuta en segundo plano, pero aún está conectado a la consola, por lo que puede escribir en la consola, es posible que pueda hacer algo como esto:
$prog | tee $prog_out_file while true do sleep 2 grep -q "Started Ok" $prog_out_file && break done # Continue here...La idea es seguir repitiendo hasta que veas "Started Ok" impreso en la salida redirigida.