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?


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.


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/*

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.