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.
Probablemente tenga que escribir un módulo kernel; No creo que puedas hacer esto desde el espacio de usuario con precisión. –
Relacionados: http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-September/003367.html –
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 **. –