Як перелічити дескриптори відкритих файлів (та файли, на які вони посилаються) у моєму поточному сеансі bash


23

Я біжу в інтерактивному сеансі баш. Я створив дескриптори файлів, використовуючи exec, і я хотів би перерахувати, який зараз статус мого bash сесії.

Чи є спосіб перерахувати дескриптори файлів, що відкриваються на даний момент?


1
перевірити це посилання
Камарадж

@Kamaraj дякую Тож баш не має вбудованого для цього? Мені потрібно використовувати особливості Linux?
dangonfast

bashне є частиною ядра, тому він не може знати, що роблять інші процеси, навіть ті, які він почав.
Джулі Пелтьє

@JuliePelletier: але дочірні процеси не змінюють дескрипторів файлів батьківського процесу, чи не так?
dangonfast

Відповіді:


27

Так, у цьому списку будуть відкриті всі дескриптори відкритих файлів:

$ 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

Звичайно, як завжди: 0 - stdin, 1 - stdout і 2 - stderr.
Четвертий - це відкритий файл (писати) у цьому випадку.


Це просто перелік поточного процесу, а не його дітей чи батьків.
Джулі Пелтьє

@JuliePelletier У заголовку питання написано "моя поточна сеанс баш". Я розумію це неправильно?
соронтар

@JuliePelletier: чому мене цікавлять дескриптори файлів, які використовуються дітьми чи батьками мого поточного сеансу bash? Мене цікавлять лише дескриптори файлів, які використовуються в моєму поточному сеансі bash.
dangonfast

@delavnog: Добре тоді. Якщо це відповідає на ваше запитання, слід позначити його як таке.
Джулі Пелтьє

4

Припустимо, що ви хочете перерахувати дескриптори файлів, які приєднані до будь-якого терміналу, ви можете використовувати lsof/ fuserабо подібні на кшталт:

$ 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

Ці інструменти в основному розбирають /proc, тому ви можете просто отримати доступ, /proc/$$/fd/наприклад:

ls /proc/$$/fd/*

2
Вибір \/pts\/відхиляє відкриті файли типуexec 4>testfile.txt
sorontar

@sorontar Так, як я вже сказав, це лише для переліку тих, що додаються до будь-якого терміналу.
heemayl

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.