現在のbashセッションで開いているファイル記述子(およびそれらが参照するファイル)をリストする方法


23

インタラクティブなbashセッションで実行しています。execを使用していくつかのファイル記述子を作成しました。bashセッションの現在のステータスを一覧表示したいと思います。

現在開いているファイル記述子をリストする方法はありますか?



@Kamarajありがとう。bashにはそれを行うための組み込み機能がありませんか?Linux固有の機能を使用する必要がありますか?
ダンゴンファスト16

bashカーネルの一部ではないため、他のプロセスが何を行っているのか、たとえそれが開始したものであってもそれを知ることはできません。
ジュリーペレティエ

@JuliePelletier:ただし、子プロセスは親プロセスのファイル記述子を変更しませんか?
ダンゴンファスト16

回答:


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は標準入力、1は標準出力、2は標準エラーです。
この場合、4番目は(書き込み用の)オープンファイルです。


子または親ではなく、現在のプロセスのみをリストします。
ジュリーペレティエ

@JuliePelletier質問のタイトルには「現在のbashセッション」と表示されています。私はそれが間違っていると理解していますか?
sorontar

@JuliePelletier:現在のbashセッションの子または親が使用するファイル記述子に興味があるのはなぜですか?現在のbashセッションで使用されているファイル記述子にのみ興味があります。
ダンゴンファスト16

@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 16

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.