Geçerli bash oturumumda açık dosya tanımlayıcılarını (ve başvurdukları dosyaları) nasıl listeleyebilirim?


23

Etkileşimli bir bash oturumunda koşuyorum. Exec kullanarak bazı dosya tanımlayıcıları oluşturdum ve bash oturumumun mevcut durumunun ne olduğunu listelemek istiyorum.

Şu anda açık olan dosya tanımlayıcılarını listelemenin bir yolu var mı?



@Kamaraj teşekkürler. Yani bash'ın bunu yapacak yerleşik bir özelliği yok mu? Linux'a özgü özellikleri kullanmam gerekiyor mu?
dangonfast

bashçekirdeğin bir parçası değildir, bu yüzden başladığı süreçleri bile diğer işlemlerin ne yaptığını bilemez.
Julie Pelletier

@JuliePelletier: ancak alt işlemler üst sürecin dosya tanımlayıcılarını değiştirmez, değil mi?
dangonfast

Yanıtlar:


27

Evet, bu tüm açık dosya tanımlayıcılarını listeleyecektir:

$ 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

Tabii ki, her zamanki gibi: 0 stdin, 1 stdout ve 2 stderr.
4. bu durumda (yazmak için) açık bir dosyadır.


Bu sadece o anki süreci listeler, çocukları veya ebeveyni listeler.
Julie Pelletier

@JuliePelletier Soru başlığı 'şu anki bash oturumum' diyor. Bunu yanlış anlıyor muyum?
sorontar

@JuliePelletier: Neden şu anki bash oturumumun çocukları veya ebeveynleri tarafından kullanılan dosya tanımlayıcılarıyla ilgileneyim ki? Yalnızca geçerli bash oturumum tarafından kullanılan dosya tanımlayıcılarıyla ilgileniyorum.
dangonfast

@delavnog: İyi o zaman. Bu, sorunuza cevap veriyorsa, soruyu böyle işaretlemelisiniz.
Julie Pelletier

4

Herhangi bir terminale bağlı dosya tanımlayıcılarını listelemek istediğinizi varsayarsak, lsof/ fuserveya benzerlerini aşağıdaki gibi kullanabilirsiniz:

$ 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

Bu araçlar temelde ayrıştırmak /proc, böylece olabildiğince adil erişim /proc/$$/fd/çok örn:

ls /proc/$$/fd/*

2
Seçim \/pts\/gibi açık dosyaları reddediyorexec 4>testfile.txt
sorontar

@sorontar Evet, dediğim gibi bu sadece herhangi bir terminale bağlı olanları listelemek için.
heemayl

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.