Digamos que eu tenho um script bash chamado log.sh
. Neste script, quero ler a entrada de um canal, mas também quero saber o comando usado para canalizar a entrada em mim. Exemplo:
tail -f /var/log/httpd/error | log.sh
No script shell, quero conhecer o comando tail -f /var/log/httpd/error
.
Respostas:
Akira sugeriu o uso
lsof
.Aqui está como você pode criar um script:
whatpipe2.sh
Executando:
Outra maneira é usar grupos de processos.
whatpipe1.sh
Executando:
Observe que os dois só funcionam se o comando no lado esquerdo do tubo for executado por tempo suficiente para
ps
vê-lo. Você disse que estava usandotail -f
, então duvido que isso seja um problema.fonte
o canal aparecerá como uma entrada na lista de descritores de arquivos abertos do seu processo:
você também pode usar algo como:
então, do que você tem o inode do pipe :) agora você pode pesquisar todos os outros processos sob
/proc/
esse pipe. então você terá o comando que está direcionando para você:neste exemplo,
cat
canalizado para as enfermariassh
. em/proc/29889
você pode encontrar um arquivo chamadocmdline
que informa exatamente o que foi chamado:os campos da linha de comando são separados por NUL, portanto, parece um pouco feio :)
fonte
Aqui está uma solução compacta que usa
lsof
distribuições modernas e modernas do Linux:Isso lista os arquivos de terminal (
+E
) do FD 0 no processo atual do shell (-p $$ -a -d 0
) e limita a saída apenas aos PIDs (-t
), produzindo os PIDs nos dois lados do tubo.Observe que:
{ echo Hi; sleep 5 ; } | whatpipe.sh
, provavelmente produzirá umbash
(subshell de entrada) esleep 5
.+E
está disponível apenas selsof
foi compilado com-DHASUXSOCKEPT
. Isso deve ser verdade para as distribuições mais modernas do Linux, mas verifique sua instalação de qualquer maneira com:lsof -v 2>&1 | grep HASUXSOCKEPT
fonte