Cara daftar deskriptor file terbuka (dan file yang mereka rujuk) di sesi bash saya saat ini

23

Saya menjalankan sesi bash interaktif. Saya telah membuat beberapa deskriptor file, menggunakan exec, dan saya ingin mendaftar apa status sesi bash saya saat ini.

Apakah ada cara untuk membuat daftar deskriptor file yang saat ini terbuka?

dangonfast
sumber
1
periksa tautan
Kamaraj
@Kamaraj terima kasih. Jadi bash tidak punya bawaan untuk melakukan itu? Saya perlu menggunakan fitur spesifik linux?
dangonfast
bashbukan bagian dari kernel, jadi tidak bisa tahu apa yang dilakukan proses lain, bahkan yang sudah dimulai.
Julie Pelletier
@JuliePelletier: tetapi proses anak tidak mengubah deskriptor file dari proses induk, bukan?
dangonfast

Jawaban:

27

Ya, ini akan mencantumkan semua deskriptor file terbuka:

$ 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

Tentu saja, seperti biasa: 0 adalah stdin, 1 adalah stdout dan 2 adalah stderr.
Keempat adalah file terbuka (untuk menulis) dalam hal ini.

sorontar
sumber
Itu hanya daftar proses saat ini, bukan anak-anak atau orang tuanya.
Julie Pelletier
@JuliePelletier Judul pertanyaan tidak mengatakan 'sesi bash saya saat ini'. Apakah saya salah mengerti?
sorontar
@JuliePelletier: mengapa saya tertarik pada deskriptor file yang digunakan oleh anak-anak atau orang tua dari sesi bash saya saat ini? Saya hanya tertarik pada deskriptor file yang digunakan oleh sesi bash saya saat ini.
dangonfast
@delavnog: Bagus kalau begitu. Jika itu menjawab pertanyaan Anda, Anda harus menandainya seperti itu.
Julie Pelletier
4

Dengan asumsi Anda ingin daftar deskriptor file yang dilampirkan ke terminal apa pun, Anda dapat menggunakan lsof/ fuseratau serupa seperti:

$ 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

Alat-alat ini pada dasarnya parse /proc, jadi Anda juga bisa mengaksesnya /proc/$$/fd/misalnya:

ls /proc/$$/fd/*
heemayl
sumber
2
Pilihan \/pts\/menolak file terbuka sepertiexec 4>testfile.txt
sorontar
@sorontar Yap, seperti yang saya katakan ini hanya untuk daftar yang terpasang ke terminal apa pun.
heemayl
3
lsof -a -p $$

Hanya jaringan fd:

lsof -i -a -p $$
g10guang
sumber