Considere o uso de SystemTap . É um clone do DTrace, mas para Linux - ele compila o módulo do kernel que corrige dinamicamente o kernel e tem acesso total aos seus dados (portanto, lsof
pode não ser necessário nesse caso).
No entanto, quanto mais informações você perguntar, mais complicado e script específico da versão do kernel se tornará.
Por exemplo, um utilitário semelhante a estatísticas para sockets será parecido com:
global stats;
probe begin {
printf("%14s %6s %12s %5s %5s %8s\n", "NAME", "PID", "EXECNAME",
"INO", "OPS/S", "BYTES");
}
function file_ino:long (file:long)
{
if(file == 0) return -1;
d_inode = @cast(file, "file", "kernel")->f_inode;
if (d_inode == 0) return -1;
return @cast(d_inode, "inode", "kernel")->i_ino;
}
probe socket.send, socket.receive {
if(success == 0) next;
/* Get inode number for a socket. Depending on
operation, struct file is contained in different fields.
Determine that field and get inode number */
ino = -1;
if(@defined($sock)) {
ino = file_ino($sock->file);
}
else if(@defined($iocb)) {
ino = file_ino($iocb->ki_filp);
}
stats[pid(), execname(), ino, name] <<< size;
}
probe timer.s(1) {
/* Every 1 second print statistics */
foreach([pid+, ename, ino, name] in stats) {
printf("%14s %6d %12s %5d %5d %8d\n", name, pid, ename, ino,
@count(stats[pid, ename, ino, name]),
@sum(stats[pid, ename, ino, name]));
}
delete stats;
}
Eu testei no vanilla Linux 3.12, mas como você pode ver a lógica de obter um número de inode depende da estrutura interna do kernel.
Como você pode ver, na maioria das vezes, ele se registra na sessão SSH:
NAME PID EXECNAME INO OPS/S BYTES
socket.send 2655 sshd 7480 1 96
socket.send 2655 sshd 7480 1 96
socket.send 2655 sshd 7480 1 96
...
Existe um script muito mais complexo nos exemplos: link
Aviso
O SystemTap é um software em nível de kernel em desenvolvimento, então existe a possibilidade de panes ou congelamentos do kernel. No entanto, é muito raro, mas tenha cuidado com isso.