2011-07-20 9 views
5

He visto programas de supervisión en scripts que comprueban el estado del proceso usando 'ps' o 'estado del servicio (en Linux)' periódicamente, o en C/C++ que bifurca y espera en el proceso ...subproceso bash restart con la aplicación SIGCHLD?

I ¿Se pregunta si es posible usar bash con trap y reiniciar el subproceso cuando recibió SIGCLD?

He probado una suite básica en RedHat Linux con siguiente idea (y ciertamente no funcionó ...)

#!/bin/bash 
set -o monitor # can someone explain this? discussion on Internet say this is needed 
trap startProcess SIGCHLD 
startProcess() { 
    /path/to/another/bash/script.sh & # the one to restart 
    while [ 1 ] 
    do 
    sleep 60 
    done 
} 
startProcess 

lo que la escritura del golpe que se inició simplemente dormir durante unos segundos y la salida de ahora.

varios problemas observados:

  • cuando el proyectil se inicia en primer plano, SIGCHLD serán tratados sólo una vez. Cómo funciona la señal de restablecimiento de trampa como señal()?
  • el script y su hijo parecen ser inmunes a SIGINT, lo que significa que no pueden ser detenidos por^C
  • ya que no se puede cerrar, cerré el terminal. El guión parece ser HUP y quedan muchos zombis.
  • cuando se ejecuta en segundo plano, la secuencia de comandos de terminal causado a morir

... de todos modos, esto no funciona en absoluto. Debo decir que sé muy poco sobre este tema. ¿Alguien puede sugerir o dar algunos ejemplos de trabajo? ¿Hay scripts para tal uso?

¿qué le parece usar wait in bash, entonces?

Gracias

Respuesta

6

puedo tratar de responder algunas de sus preguntas, pero no todos en base a lo que sé.

  1. La línea set -o monitor (o equivalentemente, set -m) Se activa el control de trabajos , que sólo está activada de forma predeterminada para los shells interactivos. Esto parece que se requiere para que se envíe SIGCHLD. Sin embargo, el control de trabajos es más de , una función interactiva y no está realmente destinado a usarse en scripts de shell (ver también this question).

    También hay que tener en cuenta que no es probable que lo que se pretende hacer porque una vez que se habilita el control de trabajos, SIGCHLD será enviado por cada comando externo que existe (por ejemplo, cada vez que se ejecuta ls o grep o nada , un SIGCHLD se disparará cuando se complete ese comando y se ejecutará su trampa ).

  2. Sospecho que la razón de la trampa SIGCHLD sólo aparece para funcionar una vez es porque su manejador trampa contiene un bucle infinito primer plano, por lo que su guión se queda atascado en el controlador trampa. No parece haber un punto en ese circuito de todos modos, por lo que podría simplemente eliminarlo.

  3. La "inmunidad" del guion para SIGINT parece ser un efecto de habilitar el control de trabajo (la parte del monitor). Mi corazonada es con el control de trabajo activado, la sub-instancia de bash que ejecuta su secuencia de comandos ya no termina sí mismo en respuesta a un SIGINT pero en su lugar pasa el SIGINT a su proceso secundario en primer plano. En el script, la ^C decir SIGINT simplemente actúa como una declaración continue en otros lenguajes de programación caso, ya que SIGINT se acaba de matar al sleep 60 actualmente en ejecución, con lo cual el bucle while se ejecute de inmediato un nuevo sleep 60.

  4. Cuando traté de ejecutar su secuencia de comandos y luego matarlo (desde otra terminal ), todo lo que terminé con dos procesos de sueño extraviados.

  5. backgrounding que el guión también mata a mi concha para mí, aunque el comportamiento no es muy consistente (a veces sucede inmediatamente, otras veces no del todo). Parece que teclear cualquier otra clave que enter haga que se envíe un EOF de alguna manera. Incluso después de que la terminal sale, el script continúa ejecutándose en segundo plano. No tengo idea qué está pasando aquí.

Ser más específico acerca de lo que quiere lograr ayudaría. Si lo que desea es un comando para ejecutar de forma continua durante toda la vida útil de su script , podría ejecutar un bucle infinito en el fondo, como

while true; do 
    some-command 
    echo some-command finished 
    echo restarting some-command ... 
done & 

Nota del & después de la done.

Para otras tareas, wait es probablemente una mejor idea que utilizar el control de trabajo en un script de shell. De nuevo, dependerá de qué es exactamente lo que está intentando hacer.

+0

Gracias Jimmy, por compartir e incluso probar el terrible guión. He detenido el intento, usando la forma "tradicional" de hacerlo, un bucle y comprobando uno. Sin embargo, probé el de "esperar", realmente funciona muy bien en escenarios básicos. ! '#/Bin/bash thepid = 0 StopNow = 0 conjunto -O monitorear trampa de limpieza SIGINT SIGTERM limpieza() { trampa - SIGINT SIGTERM StopNow = 1 si [$ {} thepid -ne 0] continuación echo $ matando {} thepid kill $ {} thepid fi } mientras que [$ {} StopNow -ne 1] hacen eco que empieza ./trial.sh y thepid = $! echo "esperando $ {thepid}" espera $ {thepid} hecho salida 0 ' –

Cuestiones relacionadas