Linux Shell Basics:lsofを使用せずに即座にファイル記述子の状態(リダイレクト)を確認するには?

Linux Shell Basics:lsofを使用せずに即座にファイル記述子の状態(リダイレクト)を確認するには?

私は学んでいますファイル記述子Linuxでは、表示するコマンドがあるかどうかを知りたいです。全リストこれを私に教えてください。それぞれはどこにリダイレクトされますか?今この瞬間まで。
おそらく次の情報があります。

0  -->  <stdin
1  -->  >stdout
2  -->  >stderr
3  -->  >MyFileForWriting
4  -->  <MyFileForReading

私が見つけたこのスレッドこれは必須ですが、lsofこのコマンドがある場合は、このコマンドに依存しない他の方法を使用すると便利です。
Linuxに関する情報が必要です(これまで「lsof」ツールは含まれていませんが、ほとんどの場合、POSIX互換OSのように動作するCygWinも試してみます)。

答え1

ファイル/procシステムには、正確に次の情報がリストされます。

$ ls -l /proc/self/fd
total 0
lrwx------ 1 michas users 1 Apr  6 04:44 0 -> /dev/pts/0
lrwx------ 1 michas users 1 Apr  6 04:44 1 -> /dev/pts/0
lrwx------ 1 michas users 1 Apr  6 04:44 2 -> /dev/pts/0
lr-x------ 1 michas users 1 Apr  6 04:44 3 -> /proc/6934/fd
$ ls -l /proc/self/fd 2>/dev/null <<<foo |cat
total 0
lr-x------ 1 michas users 1 Apr  6 04:45 0 -> /tmp/sh-thd-361068043 (deleted)
l-wx------ 1 michas users 1 Apr  6 04:45 1 -> pipe:[136729]
l-wx------ 1 michas users 1 Apr  6 04:45 2 -> /dev/null
lr-x------ 1 michas users 1 Apr  6 04:45 3 -> /proc/6952/fd

他のプロセスに興味がある場合は、「self」をそのPIDに置き換えます。

答え2

@Patrick は、以下の説明でこれらのファイルにアクセスするには、デフォルト以外のカーネルコンパイル時間オプションが必要であることを指摘しています。私はその時点でこれを認識しておらず、今まで見つかりませんでした。私のカーネルパッケージはパッケージマネージャを介してインストールされていることを知っていますが、少なくとも1つのディストリビューションのデフォルトビルドに含める必要があります。したがって、特にCygwinが関与している場合、マイルが異なる場合があります。

少なくとも含めると、より完全なリストが得られると思います。/proc/self/map_files:

% sudo ls -al ${p=/proc/$$}/map_files | sudo sort -t\> -ubk2,2  

lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 400000-4a6000 -> /usr/bin/zsh
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e05aa3000-7f5e05ac3000 -> /usr/lib/ld-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e04b88000-7f5e04b8c000 -> /usr/lib/libattr.so.1.1.0
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e04d8d000-7f5e04f2b000 -> /usr/lib/libc-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e0589f000-7f5e058a3000 -> /usr/lib/libcap.so.2.24
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e0569b000-7f5e0569e000 -> /usr/lib/libdl-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e05135000-7f5e05235000 -> /usr/lib/libm-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e05436000-7f5e05496000 -> /usr/lib/libncursesw.so.5.9
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e0497c000-7f5e04987000 -> /usr/lib/libnss_files-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e05afa000-7f5e05c83000 -> /usr/lib/locale/locale-archive
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e0450c000-7f5e0452f000 -> /usr/lib/zsh/5.0.5/zsh/complete.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e038e0000-7f5e038ee000 -> /usr/lib/zsh/5.0.5/zsh/complist.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e036cb000-7f5e036db000 -> /usr/lib/zsh/5.0.5/zsh/computil.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e03cf3000-7f5e03cfc000 -> /usr/lib/zsh/5.0.5/zsh/parameter.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e03aef000-7f5e03af2000 -> /usr/lib/zsh/5.0.5/zsh/stat.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e04101000-7f5e04103000 -> /usr/lib/zsh/5.0.5/zsh/terminfo.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e04731000-7f5e04773000 -> /usr/lib/zsh/5.0.5/zsh/zle.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e03efe000-7f5e03f00000 -> /usr/lib/zsh/5.0.5/zsh/zleparameter.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e04304000-7f5e0430b000 -> /usr/lib/zsh/5.0.5/zsh/zutil.so

これはソートされた一意のリストです。リストは非常に似ているようです。

% lsof -p ${p##*/}

COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
zsh     23748 mikeserv  cwd    DIR    0,3        0 7800580 /proc/23748/map_files
zsh     23748 mikeserv  rtd    DIR   0,33      254     256 /
zsh     23748 mikeserv  txt    REG   0,33   705496 1281560 /usr/bin/zsh
zsh     23748 mikeserv  mem    REG   0,30          1281560 /usr/bin/zsh (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281593 /usr/lib/zsh/5.0.5/zsh/computil.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281592 /usr/lib/zsh/5.0.5/zsh/complist.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281579 /usr/lib/zsh/5.0.5/zsh/stat.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281576 /usr/lib/zsh/5.0.5/zsh/parameter.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281596 /usr/lib/zsh/5.0.5/zsh/zleparameter.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281582 /usr/lib/zsh/5.0.5/zsh/terminfo.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281587 /usr/lib/zsh/5.0.5/zsh/zutil.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281591 /usr/lib/zsh/5.0.5/zsh/complete.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281595 /usr/lib/zsh/5.0.5/zsh/zle.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1936654 /usr/lib/libnss_files-2.19.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30            23825 /usr/lib/libattr.so.1.1.0 (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1936661 /usr/lib/libc-2.19.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1936618 /usr/lib/libm-2.19.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30            24316 /usr/lib/libncursesw.so.5.9 (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1936627 /usr/lib/libdl-2.19.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1249113 /usr/lib/libcap.so.2.24 (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1936645 /usr/lib/ld-2.19.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1720288 /usr/lib/locale/locale-archive (path dev=0,33)
zsh     23748 mikeserv    0u   CHR  136,6      0t0       9 /dev/pts/6
zsh     23748 mikeserv    1u   CHR  136,6      0t0       9 /dev/pts/6
zsh     23748 mikeserv    2u   CHR  136,6      0t0       9 /dev/pts/6
zsh     23748 mikeserv   10u   CHR  136,6      0t0       9 /dev/pts/6

まあ、とにかくファイル名ですね。私はこの機能の多くが可能なPIDstat,およびps/または興味深いPIDを使用して簡単に再現できると思います。明らかにディレクトリがあり、fd他の答えで述べたように、/proc/selfファイルシステムからルート、cwdを取得することもできます。

関連情報