Como encontrar o arquivo correspondente a um pipe aberto por um processo? [duplicado]

4

Eu criei esse script, que ouve os caracteres recebidos em um canal codificado e tenta eval desses caracteres. Eu chamo meu script loop_executor.sh Isso é tudo o que contém:

!/bin/bash

while :
do
    x='cat /tmp/console_test';
    echo "received $x"
    eval $x
done;

Eu executo meu script com um duplo clique.

Eu quero ver quais arquivos este processo abriu:

> $ pgrep loop_executor.sh
1234

> $ ll /proc/1234/fd
dr-x------ 2 userX domain^users  0 Oct 20 17:57 ./
dr-xr-xr-x 9 userX domain^users  0 Oct 20 17:57 ../
lr-x------ 1 userX domain^users 64 Oct 20 17:57 0 -> /dev/null
l-wx------ 1 userX domain^users 64 Oct 20 17:57 1 -> /dev/null
l-wx------ 1 userX domain^users 64 Oct 20 17:57 2 -> /home/local/groupX/userX/.xsession-errors
lr-x------ 1 userX domain^users 64 Oct 20 17:58 255 -> /home/local/groupX/userX/Desktop/loop_executor.sh*
lr-x------ 1 userX domain^users 64 Oct 20 17:57 3 -> pipe:[225812]

FD 3 aponta para um "pipe". Bem, eu sei que arquivo ele usa, porque eu sou o único que codificou o arquivo no script, mas eu gostaria de obter essa informação (se possível) de outra fonte (já que meu script é apenas um POC, e poderia ser um processo cujo código não está aberto para mim).

O que eu entendi é que pipe:[225812] não aponta para o inode do meu arquivo.

ll -i /tmp/console_test 
16519395 prw-r--r-- 1 userX domain^users 0 Oct 20 18:14 /tmp/console_test|

Então, minha pergunta é: Se processess pode abrir pipes, que são arquivos em meu sistema, posso determinar quais arquivos esses pipes "corresponderam"?

Estou usando o Ubuntu 12.04, se isso importa.

[EDITAR] Encontrei o processo cat que estava lendo meu canal. Tem o mesmo tubo aberto que o processo pai, por isso não faz muita diferença aqui - > eu ainda não sei apenas olhando para pipe:[225812] qual arquivo - se algum - é isso.

    
por vlad-ardelean 20.10.2014 / 17:41

1 resposta

2

Seu script não tem /tmp/console_test aberto, o cat process. Seu script está lendo de um pipe que está conectado ao processo cat ; é o que você está vendo na sua pergunta.

Pesquise o processo cat e verifique esse.

Você provavelmente quer algo assim:

while read x; do
    echo "received $x"
    eval "$x"
done < /tmp/console_test

Observe as citações adicionadas ao redor do parâmetro para eval

    
por 20.10.2014 / 17:44