Como listar os descritores de arquivo aberto (e os arquivos a que eles se referem) na minha sessão atual do bash

23

Estou executando uma sessão interativa do bash. Eu criei alguns descritores de arquivo, usando exec, e gostaria de listar qual é o status atual da minha sessão do bash.

Existe uma maneira de listar os descritores de arquivos abertos no momento?

dangonfast
fonte
1
verifique este link
Kamaraj
@Kamaraj thanks. Então o bash não tem built-in para fazer isso? Preciso usar recursos específicos do Linux?
dangonfast
bashnão faz parte do kernel, portanto, não pode saber o que outros processos estão fazendo, mesmo aqueles que foram iniciados.
Julie Pelletier
@JuliePelletier: mas os processos filhos não alteram os descritores de arquivo do processo pai, eles mudam?
dangonfast

Respostas:

27

Sim, isso listará todos os descritores de arquivos abertos:

$ ls -la /proc/$$/fd
total 0
dr-x------ 2 sorontar sorontar  0 Dec 28 00:56 .
dr-xr-xr-x 9 sorontar sorontar  0 Dec 28 00:56 ..
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 0 -> /dev/pts/6
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 1 -> /dev/pts/6
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 2 -> /dev/pts/6
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 255 -> /dev/pts/6
l-wx------ 1 sorontar sorontar 64 Dec 28 00:56 4 -> /home/sorontar/testfile.txt

Obviamente, como sempre: 0 é stdin, 1 é stdout e 2 é stderr.
O quarto é um arquivo aberto (para escrever) neste caso.

sorontar
fonte
Isso apenas lista o processo atual, não seus filhos ou pais.
Julie Pelletier
@JuliePelletier O título da pergunta diz 'minha atual sessão do bash'. Estou entendendo isso errado?
sorontar
@JuliePelletier: por que eu estaria interessado nos descritores de arquivo usados ​​pelas crianças ou pelos pais da minha sessão atual do bash? Estou interessado apenas nos descritores de arquivo que estão sendo usados ​​pela minha sessão atual do bash.
dangonfast
@ delavnog: Bom então. Se isso responder à sua pergunta, marque-a como tal.
Julie Pelletier
4

Supondo que você queira listar os descritores de arquivo anexados a qualquer terminal, você pode usar lsof/ fuserou similares, como:

$ lsof -p $$ 2>/dev/null | awk '$NF ~ /\/pts\//'
bash    32406 foobar    0u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    1u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    2u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    3u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar  255u   CHR 136,31      0t0      34 /dev/pts/31

Essas ferramentas basicamente analisam /proc, para que você possa acessar /proc/$$/fd/também, por exemplo:

ls /proc/$$/fd/*
heemail
fonte
2
A seleção de \/pts\/rejeita arquivos abertos comoexec 4>testfile.txt
sorontar
@ absorontar Sim, como eu disse, este é apenas para listar os que estão conectados a qualquer terminal.
heemayl
3
lsof -a -p $$

Apenas rede fd:

lsof -i -a -p $$
g10guang
fonte