Come posso monitorare i file aperti di un processo in tempo reale?


42

So di poter visualizzare i file aperti di un processo usando lsof in quel momento sulla mia macchina Linux. Tuttavia, un processo può aprire, alterare e chiudere un file così rapidamente che non sarò in grado di vederlo quando lo monitoro usando lo script di shell standard (ad es. watch) Come spiegato in "monitorare i file di processo aperti su Linux (in tempo reale)" .

Quindi, penso di essere alla ricerca di un modo semplice per controllare un processo e vedere cosa ha fatto nel tempo. Sarebbe bello se fosse anche possibile vedere quali connessioni di rete ha (tentato) di fare e far iniziare il controllo prima che il processo abbia il tempo di essere eseguito senza che il controllo venga avviato.

Idealmente, vorrei fare questo:

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

Questo sarebbe possibile utilizzando stracee alcuni flag per non vedere tutte le chiamate di sistema?


Risposte:


51

Eseguendolo con

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

sarebbe probabilmente sufficiente.

Dovrai usare l' -oopzione per mettere l'output di strace in un posto diverso dalla console, se il processo può stampare su stderr. Se il tuo processo si biforca, avrai anche bisogno di -fo -ff.

Oh, e potresti desiderare -tanche tu, così puoi vedere quando sono avvenute le chiamate.


Nota, potrebbe essere necessario modificare l'elenco delle chiamate delle funzioni a seconda di ciò che fa il tuo processo - ho dovuto aggiungere getdentsad esempio, per ottenere un campione migliore usando 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

1
Sta andando nella giusta direzione, grazie! Vorrebbe un output più user friendly, ma fa il lavoro. Potrei impiegare del tempo per scrivere uno strumento con un'interfaccia più simile a questa. Speravo che esistesse uno strumento basato su ncurses o "top" per ispezionare le azioni del binario in tempo reale.
Gertvdijk,

Come vorresti che fosse? Probabilmente è possibile trasformare l'output di strace in qualcosa di più amichevole.
Inutile

si desidera sicuramente utilizzare -oper inviare l'output ai file. Quindi è possibile eseguire tail -F strace.outputin un altro terminale per ottenere l'aggiornamento "live".
peterph

4
Puoi anche collegarti stracea un processo in esecuzione con l' -p PIDopzione.
Frank Breitling

Inserisci -y a "[p] percorsi di stampa associati agli argomenti del descrittore di file"
ricab il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.