web-dev-qa-db-fra.com

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

Je sais que je peux afficher 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 de scripts Shell standard (par exemple watch) comme expliqué dans "monitor open traiter les fichiers sur linux (en temps réel) " .

Donc, je pense que je cherche un moyen simple d'auditer un processus et de voir ce qu'il a fait au fil du temps. Ce serait formidable s'il était également possible de voir quelles connexions réseau il (essayait de faire) et de faire démarrer l'audit avant que le processus n'ait le temps de s'exécuter sans que l'audit ne soit démarré.

Idéalement, je voudrais 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-ce possible en utilisant strace et certains indicateurs pour ne pas voir chaque appel système?

44
gertvdijk

L'exécuter avec

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

serait probablement suffisant.

Vous devrez utiliser le -o option pour placer la sortie de strace ailleurs que dans la console, si le processus peut imprimer sur stderr. Si votre processus bifurque, vous aurez également besoin de -f ou -ff.

Oh, et vous voudrez peut-être -t également, pour que vous puissiez voir quand les appels ont eu lieu.


Remarque, vous devrez peut-être modifier la liste d'appels de fonction en fonction de ce que fait votre processus - j'avais besoin d'ajouter getdents par 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
53
Useless