Você pode usar strace
para isso:
strace -f -e trace=file command args...
strace
rastreia as chamadas do sistema e imprime uma descrição delas para o erro padrão conforme elas ocorrem. A opção -f
diz para rastrear processos e encadeamentos filhos também. -e
permite modificar as chamadas que serão rastreadas: -e trace=file
registrará todo uso de open
, unlink
, etc, mas nenhuma ação sem arquivo.
Se você quiser ver o que foi lido e gravado em arquivos, altere-o para -e trace=file,read,write
; Você pode listar todas as chamadas adicionais que você deseja examinar lá também. Se você deixar de lado esse argumento, você recebe todas as chamadas do sistema.
A saída é assim (eu corri mkdir /tmp/test
em um shell rastreado):
[pid 1444] execve("/usr/bin/mkdir", ["mkdir", "/tmp/test4"], [/* 33 vars */]) = 0
[pid 1444] access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
[pid 1444] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid 1444] open("/usr/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[pid 1444] open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
[pid 1444] mkdir("/tmp/test", 0777) = 0
[pid 1444] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1444, si_status=0, si_utime=0, si_stime=0} ---
Você pode registrar em um arquivo em vez do terminal com -o filename
e tornar a saída (mesmo) mais detalhada com -v. Também é possível anexar a um processo já existente com -p PID
, caso isso seja mais útil.
Se você quiser fazer isso de maneira programática, em vez de inspecionar a si mesmo, consulte a ptrace
call , que é o que strace
é construído.