¿Hay alguna manera de decir exactamente a qué files está accediendo un command?

Estoy trabajando en un progtwig que me obliga a saber a qué files y resources acceden ciertos processs lanzados.

No estoy planeando realizar un seguimiento del acceso de cada script, aplicación y daemon, solo un cierto process proporcionado por el usuario.

¿Hay alguna forma de hacer esto en Python (o en cualquier otro idioma)? Voy a hacer mi propia investigación, pensé que podría preguntar aquí en caso de que haya usuarios conocedores que conozcan este tipo de cosas y puedan darnos más explicaciones.

Puede rastrear las llamadas al sistema que hace un progtwig. Este es el método habitual para averiguar a qué files accede. La herramienta para hacer esto se llama truss en muchos sistemas Unix, dtruss en OSX, strace en Linux. Describiré el uso de Linux aquí; revise el manual en otros sistemas.

La forma más simple es

 strace myprogram arg1 arg2 

Esto imprime un logging de todas las llamadas al sistema realizadas por myprogram . ( Ejemplo .) Para save el logging en un file, use la opción -o . Para registrar también las llamadas realizadas por subprocesss, use la opción -f . Para seleccionar qué llamadas al sistema se registran, use la opción -e . Consulte el manual para get detalles de lo que puede usar como argumento para -e . Por ejemplo, la siguiente invocación registra llamadas al sistema relacionadas con files (apertura y cierre, listdo de directorys, etc.) excepto read y write .

 strace -e'file,!read,!write' -o /tmp/myprogram.log -f myprogram arg1 arg2 

De acuerdo con esta publicación , puedes hacerlo en python usando el module psutil . Si no está limitado a Python, entonces lsof y strace son las dos utilidades de command-line más comúnmente utilizadas para este propósito.

La única manera completamente confiable de hacer esto es rastrear las llamadas al sistema. El progtwig strace (mencionado por @gowenfawr) hace esto correctamente, y se implementa en términos de la ptrace(2) al sistema ptrace(2) . Tenga en count, sin embargo, que la llamada ptrace es difícil de usar correctamente; si no puede usar strace -e open directamente, considere la segunda manera:

Para la mayoría de los processs, puede interceptar las llamadas a la function open biblioteca C a través de LD_PRELOAD . Sin embargo, es trivial para un progtwig C hostil evitar esto; pero si confía en que un progtwig no haga syscalls, es más fácil de implementar que el ptrace programático.

Para un process que sabe que está escrito en un lenguaje de nivel superior como python, podría interceptar las llamadas open alto nivel, pero es probable que esto sea más difícil que interceptar las llamadas de nivel C a less que el idioma esté diseñado para admite tal intercepción (python no lo es).

Finalmente, todos los párrafos anteriores suponen que los files se abren con open . Esto no siempre es cierto, también hay openat , open64 , recvmsg datos auxiliares y descriptores de files henetworkingados del padre.