Captura entrada / saída padrão de um processo em execução no FreeBSD / macOS

3

No Linux, geralmente uso /proc/<pid>/fd/[0,1,2] para acessar std[in,out,err] de qualquer processo em execução.

Existe uma maneira de obter o mesmo resultado no FreeBSD e / ou no macOS?

    
por M4rty 09.05.2017 / 14:29

2 respostas

4

Veja este StackOverflow link para uma resposta baseada no dtrace para isso. Eu testei no FreeBSD e funciona perfeitamente:

    capture() {
        sudo dtrace -p "$1" -qn '
            syscall::write*:entry
            /pid == $target && arg0 == 1/ {
                printf("%s", copyinstr(arg1, arg2));
            }   
        '   
    }   
    
por 12.05.2017 / 22:15
0
O

procfs também está disponível no FreeBSD, mas a partir do página man parece que fd não está implementado. O Procfs é usualmente usado apenas na compabilidade do FreeBSD for Linux.

A substituição nativa de procfs no FreeBSD é procstat que você pode usar com o parâmetro -f para obter o descritor de arquivo:

procstat -a -f

Outra ferramenta nativa para identificar arquivos ativos é fstat . Lembre-se de -m para arquivos mapeados na memória, se necessário.

fstat -m

Se você gosta de trabalhar com o sistema de arquivos, temos devfs que expõe fdescfs e você pode acessar fd da maneira que você solicita.

ls /dev/fd

Exemplo:

echo -n Hello > hello.txt
echo " World!" | cat hello.txt /dev/fd/0

Se você quiser algo que seja portátil em todo o sistema para Mac também - então você pode usar a ferramenta lsof Open Files), disponível como um pacote .

Se a portabilidade for uma preocupação, leia Portabilidade dos links do descritor de arquivo . Abrange todas as bases.

    
por 11.05.2017 / 14:46