Comment surveiller les fichiers ouverts d'un processus en temps réel?

42

Je sais que je peux voir les fichiers ouverts d'un processus en utilisant lsof à ce moment sur ma machine Linux. Cependant, un processus peut ouvrir, modifier et fermer un fichier si rapidement que je ne pourrai pas le voir lors de sa surveillance à l'aide d'un script shell standard (par exemple watch), comme expliqué dans "Surveiller les fichiers de processus ouverts sous Linux (temps réel)" .

Je pense donc que je recherche un moyen simple d’auditer un processus et de voir ce qu’il a fait au fil du temps. Ce serait bien s'il était également possible de voir quelles connexions réseau il (essayait) d'établir et que l'audit commence avant que le processus ait le temps de s'exécuter sans que l'audit ne soit démarré.

Idéalement, j'aimerais faire ceci:

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling

Serait-il possible d'utiliser straceet certains drapeaux pour ne pas voir tous les appels système?

Gertvdijk
la source

Réponses:

51

Le courir avec

strace -e trace=open,close,read,write,connect,accept your-command-here

serait probablement suffisant.

Vous devrez utiliser l' -ooption pour placer la sortie de strace ailleurs que sur la console, si le processus peut imprimer sur stderr. Si votre processus se déroule, vous aurez également besoin de -fou-ff .

Oh, et vous voudrez peut-être -taussi, ainsi vous pourrez voir quand les appels ont eu lieu.


Notez que vous devrez peut-être peaufiner la liste des appels de fonction en fonction de ce que votre processus fait - je devais ajouter getdentspar exemple, pour obtenir un meilleur échantillon en utilisant ls:

$ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@V\0\0\0\0\0\0"..., 832) = 832
09:34:48 close(3)                       = 0
...
09:34:48 open("/proc/filesystems", O_RDONLY) = 3
09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366
09:34:48 read(3, "", 1024)              = 0
09:34:48 close(3)                       = 0
09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
09:34:48 getdents(3, /* 5 entries */, 32768) = 144
09:34:48 getdents(3, /* 0 entries */, 32768) = 0
09:34:48 close(3)                       = 0
09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21
09:34:48 close(1)                       = 0
09:34:48 close(2)                       = 0
Inutile
la source
1
Cela va dans la bonne direction, merci! Voudrait une sortie plus conviviale, mais elle fait le travail. Je pourrais prendre le temps d'écrire un outil avec une interface plus top-like pour cela. J'espérais qu'un outil basé sur ncurses ou «top» existerait pour inspecter les actions du binaire en temps réel.
Gertvdijk
Comment voudriez-vous qu'il ressemble? Il est probablement possible de transformer la sortie strace en quelque chose de plus convivial.
Inutile
vous voulez certainement utiliser -opour pousser la sortie dans un fichier. Ensuite, vous pouvez exécuter tail -F strace.outputdans un autre terminal pour obtenir une mise à jour "en direct".
Peter
4
Vous pouvez également vous connecter straceà un processus en cours avec l' -p PIDoption.
Frank Breitling
Ajouter -yà "[p] chemins d'accès associés à des arguments de descripteur de fichier"
ricab