Pregunta

¿cómo puedo obtener información sobre el estado de un proceso (es decir, si es un zombie) usando C en Linux?

Después de leer las respuestas hasta ahora, quiero limitar un poco mi pregunta: preferiría una solución C pura. Después de leer la fuente ps (que lee / proc /) pensé que debería haber una mejor manera y pregunté aquí :)

¿Fue útil?

Solución

Querrá aprender sobre cómo interactuar con / proc / " psuedo-filesystem " a través de las típicas llamadas a la biblioteca estándar de C. La documentación necesaria para comenzar se incluye con cualquier distribución de Linux y está a una simple búsqueda en Google.

(Ahora que sabes qué buscar. ¡Sé que eso suele ser la mayor parte del desafío!)

En resumen, los directorios y archivos dentro del directorio / proc / de un sistema Linux en ejecución reflejan el estado del kernel en ejecución, que (naturalmente) incluye procesos. Sin embargo, antes de cobrar, debe tener en cuenta cierta información.

Un proceso zombie no es lo mismo que un proceso huérfano. Un proceso huérfano es un proceso que se ejecuta en estado de espera después de que el proceso principal se haya salido incorrectamente. Un proceso zombie es un proceso que salió correctamente, liberó todos sus recursos, pero mantiene un lugar en la tabla de procesos.

Esto suele suceder cuando un programa inicia un proceso. Verá, el núcleo no eliminará la entrada de un subproceso terminado en la tabla de proceso hasta que el programa padre recupere correctamente el estado de retorno del subproceso. Eso tiene sentido; ¿De qué otra forma sabría el programa principal si el subproceso se cerró incorrectamente?

Por lo tanto, todos los subprocesos son técnicamente zombies durante al menos un tiempo muy corto. No es inherentemente un mal estado para un programa.

De hecho, "zombies" a veces se crean intencionalmente. Por ejemplo, a veces un programa deja una entrada zombie en su lugar por un tiempo para que los procesos iniciados más adelante no obtengan el mismo PID que el proceso lanzado anteriormente (y ahora zombie).

En otras palabras, si sigues SIGCHLDing procesos zombies innecesariamente, podrías crear un problema serio para el programa de desove. Sin embargo, si un proceso ha sido un zombie durante media hora o más, probablemente sea un signo de error.

Editar: ¡La pregunta cambió para mí! No, no hay una forma más sencilla que la forma en que lo hace ps. Si lo hubiera, se habría integrado en ps hace mucho tiempo. Los archivos / proc son la fuente be-all-end-all para obtener información sobre el estado del kernel. :)

Otros consejos

Conozco solo dos formas:

  • Salida de análisis del comando ps
  • Lectura de archivos en / proc / PID, donde PID es el identificador del proceso (eso es lo que ps hace internamente)

Desea que los procesos se ejecuten en su máquina y luego use

$ ps aux

ps muestra información sobre una selección de los procesos activos. Si desea una actualización repetitiva de la selección y la información que se muestra, use top en su lugar.

Encontrado aquí :

Use this command to display all of your zombie processes:

ps aux | awk '{ print $8 " " $2 }' | grep -w Z

Esto podría analizarse fácilmente usando C.

Pseudo file system / proc está describiendo las estructuras de datos internos del núcleo y le da la oportunidad de alterar algunos valores directamente. La obtención del estado de un proceso particular se puede implementar fácilmente con las funciones de E / S C. El archivo correcto para analizar es: /proc/{PID}/status

El siguiente comando se puede utilizar para obtener procesos en estado Zombie.

for proc in $(echo /proc/[0-9]*);do if [[ $(sed -n '/^State:\tZ/p' ${proc}/status 2>/dev/null) ]];then basename $proc;fi;done
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top