No meu exemplo, o wc
programa está tentando abrir o FIFO de teste ou pipe nomeado.
Essas syscalls em andamento open
parecem não ser mostradas por fuser
ou lsof
:
mknod /tmp/testpipe p
wc /tmp/testpipe &
timeout 0.2 strace -p $! |& timeout 0.1 cat; echo
strace: Process 10103 attached
open("/tmp/testpipe", O_RDONLY
fuser /tmp/testpipe # no output
lsof | grep testpipe # no output
Como encontrar processos tentando abrir algum FIFO em sistemas Linux?
Como você sugeriu, o desafio que você vê é que a
open()
chamada não foi concluída; está bloqueando a espera de um escritor abrir. Como o pipe ainda não está aberto, ele não será exibido infuser
oulsof
ou in/proc/<pid>/fd
; nenhum identificador de arquivo foi associado a ele!Podemos ver quais processos estão aguardando a abertura de um pipe; por exemplo
Portanto, podemos ver que o PID 12104 está aguardando um cano, mas isso não nos diz qual cano. Mas podemos potencialmente usar essas informações e as
timeout strace
que você já viu...por exemplo
Isso resulta em uma saída semelhante a
Supondo que o Linux esteja aqui devido ao aparecimento do
strace
. Você não especificou, no entanto. Mecanismos semelhantes também existem para sistemas *BSD.Parece-me que você precisaria se conectar a todas
open
as chamadas e atender aquelas que abrem seu caminho. Você pode fazer isso, com sobrecarga relativamente baixa, usando o ebpf. Obpftools
pacote shipbpftrace
, que pode interpretar scripts que fazem isso.Na verdade, se você instalar
bpftrace
em seu sistema, provavelmente encontrará um diretório /usr/share/bpftrace/tools cheio de exemplos. Você pode simplesmente fugiropensnoop
disso!