の出力では、lsof
この列は常に開かれたファイルの解決された絶対パス名を出力しますかNAME
?.
..
たとえば、cd
ディレクトリへのシンボリックリンクに移動し、プログラムを実行してそのディレクトリの下のファイルを開くと、ファイルの解決された絶対パス名のみがlsof
表示されますか?
開いたファイルの未解決の絶対パス名を出力できますかlsof
?解決されていないということは、ディレクトリシンボリックリンクがパス名になければならないことを意味します。
ありがとうございます。
答え1
オプションがない場合は、解析された形式でパス名を指定する必要があります。 ~からlsof(8) マニュアル:
開くファイルは、汎用ファイル、ディレクトリ、ブロック特殊ファイル、文字特殊ファイル、実行可能テキスト参照、ライブラリ、ストリーム、またはネットワークファイル(インターネットソケット、NFSファイル、またはUNIXドメインソケット)です。パスごとにファイルを選択するか、ファイルシステム内のすべてのファイルを選択できます。
もちろん、次のエラーがある可能性があります。パス名が長すぎます。、この場合、パス名は解析されませんが、明らかに次のlsof
ように異なります。周囲のラッパー機能readlink()
、その仕事をしなければなりません。
次のようにファイル名を指定する場合lsof [options] [--] names
:
名前リストする特定のファイルのパス名。シンボリックリンクは使用前に解決されます。 「--」オプションを使用して、以前のオプションと名前を区別できます。
もちろん、ファイル名の解析に標準的な規則が適用されます。シンボリックリンクレベルが多すぎます。エラーが発生しました。lsof
MAXSYMLINKS変数によって異なる Linuxカーネルで最大40個のシンボリックリンクでハードコーディングと変数が定義されていない他のシステムの場合は、-32に設定してください。。
-b
オプションを指定すると、ファイル名は解析されません。
第三に、lsofがシステムマウントテーブルから取得したファイルシステムディレクトリ名がシンボリックリンクである場合、lsofはこれらのリンクを解決できません。これは、-bオプションを使用すると、lsofがシンボリックリンクの解決に使用するカーネルreadlink(2)関数の使用を防止するためです。
答え2
使用しているソケットファイルを開いたファイルと見なす必要があるかどうかはわかりませんが、Unixドメインソケットの場合はリストされており、渡されlsof
ますNAME
。精密相対または絶対ソケットバインディングの名前とすべてのパスアーティファクトは変更されていません。
$ cd /tmp
$ nc -dUl ./././///sock &
[3] 6324
$ ls sock /tmp/sock ./sock
./sock /tmp/sock sock
$ lsof sock /tmp/sock ./sock
[nothing]
$ lsof ./././///sock
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nc 6324 XXX 3u unix 0xffff9f9faab76000 0t0 175260 ./././///sock type=STREAM
参考にしてください非抽象的Unixドメインソケットの場合、ソケットがバインドされるかリンクされたパスは、カーネルがそれを確認するまでのみ重要です。これは、ソケットがバインドまたは接続されている物理アドレスである[device、inode]タプルです。
$ cd /tmp
$ nc -dUl ./././///sock &
[1] 7293
$ mv sock SOCK
$ lsof -aUp $!
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nc 7293 xxx 3u unix 0xffff908d70bb5800 0t0 1137631 ./././///sock type=STREAM
$ lsof ./././///sock
lsof: status error on ./././///sock: No such file or directory
[stupid junk snipped]
$ lsof SOCK
[nothing]
$ nc -U ./././///sock
nc: unix connect failed: No such file or directory
$ nc -U SOCK
[connected ok]
lsof
@
他のソケットに「接続された」(つまり、デフォルトの送信アドレスが設定されている)データグラムソケットを見つけることは不可能であり、名前にaを持つ抽象ソケットとNULを持つ抽象ソケットを区別することもできません。名前にバイトがあります。お待ちください。
興味のある人がいる場合に備えて、インターフェースを介して必要なすべての情報を取得できますsock_diag
(タイトルUDIAG_SHOW_VFS
を参照)。これを活用するにはとても愚かです。UDIAG_SHOW_PEER
linux/unix_udiag.h
lsof
注:この例では、Unixソケットをサポートするnc
Debianパッケージを使用しています。netcat-openbsd