2012-01-11 8 views
6

Me gustaría capturar el proceso entry, exit y mantener un registro para todo el sistema (probablemente un proceso de daemon).¿Alguna solución posible para capturar la entrada/salida del proceso?

Un enfoque fue leer el sistema de archivos /proc periódicamente y mantener la lista, ya que no veo la posibilidad de registrar inotify para /proc. Además, para aplicaciones de escritorio, podría obtener la ayuda de dbus, y cada vez que el cliente se registra en el escritorio, puedo capturar.

Pero para aplicaciones que no son de escritorio, no sé cómo continuar leyendo /proc periódicamente.

Por favor, proporcionar sugerencias.

+0

Probablemente tenga que escribir un módulo kernel; No creo que puedas hacer esto desde el espacio de usuario con precisión. –

+0

Relacionados: http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-September/003367.html –

+0

Puede intentar usar ptrace (http://en.wikipedia.org/wiki/Ptrace) que le permitirá interceptar syscalls como gdb puede. Tendrá que ejecutar su programa como root. Sin embargo, no tengo idea de cuán "pesado" sería este enfoque para el sistema ** completo **. –

Respuesta

1

Si desea registrar realmente todas las entradas y salidas del proceso, deberá conectar el kernel. Lo que significa modificar el kernel o al menos escribir un módulo kernel. Los "módulos de seguridad de Linux" ciertamente permitirán enganchar en la entrada, pero no estoy seguro de si es posible enganchar en la salida.

Si puede vivir con la salida ocasional deslizándose (si el binario está vinculado estáticamente o de alguna manera evita la configuración de su entorno), hay una opción simple al precargar una biblioteca.

El enlazador dinámico de Linux tiene una característica, que si la variable de entorno LD_PRELOAD(see this question) nombra una biblioteca compartida, forzará la carga de esa biblioteca en el proceso de inicio. De modo que puede crear una biblioteca, que en su inicialización estática le indicará al daemon que se ha iniciado un proceso y lo hará para que el proceso descubra cuándo finaliza el proceso.

La inicialización estática se realiza más fácilmente creando un objeto global con el constructor en C++. El vinculador dinámico asegurará que el constructor estático se ejecutará cuando se cargue la biblioteca.

También intentará hacer que el destructor correspondiente se ejecute cuando el proceso finalice, por lo que podría simplemente registrar el proceso en el constructor y el destructor. Pero no funcionará si el proceso muere de la señal 9 (KILL) y no estoy seguro de qué otras señales harán.

Por lo tanto, debe tener un daemon y en el constructor decirle al daemon sobre el inicio del proceso y asegúrese de que se dará cuenta cuando el proceso finalice por sí mismo. Una opción que me viene a la mente es abrir un socket de dominio de Unix al daemon y dejarlo abierto. Kernel lo cerrará cuando el proceso muera y el daemon lo notará. Debe tomar algunas precauciones para usar un alto número de descriptor para el socket, ya que algunos procesos pueden suponer que los números de los descriptores bajos (3, 4, 5) son gratuitos y dup2. Y no se olvide de permitir más descriptores de archivo para el daemon y para el sistema en general.

Tenga en cuenta que solo al sondear el sistema de archivos/proc, es probable que pierda la gran cantidad de procesos que solo viven por fracción de segundo. Realmente hay muchos de ellos en Unix.

2

Tal vez la forma más segura de moverse es crear un SuperProceso que actúe como padre y bifurca a los niños. Cada vez que el proceso de un niño se detiene, el padre puede encontrarlo. Eso es solo un pensamiento en caso de que la arquitectura se ajuste a sus necesidades.

Por supuesto, si el proceso padre no es factible, entonces debe ir al kernel.

3

Mencionaste/proc, así que supongo que tienes un sistema Linux allí.

Instalar el paquete acct. El comando lastcomm muestra todos los procesos ejecutados y su duración de ejecución, que es lo que está solicitando. Haga que su programa "tail"/var/log/account/pacct (encontrará su estructura descrita en acct (5)) y listo. Sin embargo, es solo una notificación de terminación. Para detectar nuevas empresas, deberá explorar periódicamente la tabla de procesos del sistema, si eso es lo que realmente necesita.

+0

+1 por el hecho de que se menciona acct aquí. Es una implementación de lo que se llama Contabilidad de procesos (http://www.faqs.org/docs/Linux-mini/Process-Accounting.html) – cateof

0

Aquí hay un resumen de la solución que se nos ocurrió.

Creamos un programa que lee un archivo de configuración de todas las aplicaciones posibles que el sistema puede monitorear. Este programa leyó el archivo de configuración y, a través de una interfaz de línea de comando, pudo iniciar o detener programas. El programa mismo almacenó una tabla en la memoria compartida que marcó las aplicaciones como ejecutando o no. Una interfaz a la que cualquiera podría acceder podría obtener el estado de estos programas. Este programa también tenía un sistema de alarma que podía enviar por correo electrónico/página o activar una alarma.

Esta solución no requiere ningún cambio en el núcleo y, por lo tanto, es una solución menos dolorosa.

Espero que esto ayude.

Cuestiones relacionadas