Você pode usar este pequeno script systemtap:
#!/usr/bin/stap
function proc:string() { return sprintf("PID(%d) UID(%d) PROC(%s)", pid(), uid(), execname()) }
probe syscall.open.return, syscall.stat.return,
syscall.open64.return ?, syscall.stat64.return ? {
filename = user_string($filename)
if ($return < 0) {
printf("failed %s on %s by %s\n", pn(), proc(), filename)
}
}
Ele conectará os syscalls abertos e stat (você pode copiar / colar o código, talvez eu tenha esquecido outros syscalls) no retorno. Como syscalls são a única maneira de se comunicar com o kernel, você não perderá nada. Este script produzirá esse tipo de saída:
failed syscall.stat.return on PID(4203) UID(1000) PROC(bash) by /tmp/rofl
failed syscall.stat.return on PID(4203) UID(1000) PROC(bash) by /tmp/hihi
entre os profissionais de usar o systemtap, temos:
- menos instrusivo para o processo
- em todo o sistema (não apenas o processo monitorado), mas você pode reduzir sua seleção diretamente no script
- menos ressource faminto (somente exibe ações com falha, nem todas para serem grep depois)
- você pode melhorar o script para obter os detalhes sobre o programa de chamada (por exemplo, seu backtrace, tempo de chamada, etc ...). Depende da sua aplicação.
E para os contras:
- não padrão, você precisa instalá-lo (mas padrão o suficiente para estar disponível na maioria das distribuições). No Redhat & variantes:
sudo yum install systemtap
- precisa ter o debuginfos para construir o módulo. No Redhat & variantes:
sudo debuginfo-install kernel
Alguns links úteis: O índice do tapset (funções incluídas) e um guia para iniciantes
Boa sorte para sua migração!