lsofが常に開いているファイルの解決された絶対パス名を表示するかどうか

lsofが常に開いているファイルの解決された絶対パス名を表示するかどうか

の出力では、lsofこの列は常に開かれたファイルの解決された絶対パス名を出力しますかNAME...

たとえば、cdディレクトリへのシンボリックリンクに移動し、プログラムを実行してそのディレクトリの下のファイルを開くと、ファイルの解決された絶対パス名のみがlsof表示されますか?

開いたファイルの未解決の絶対パス名を出力できますかlsof?解決されていないということは、ディレクトリシンボリックリンクがパス名になければならないことを意味します。

ありがとうございます。

答え1

オプションがない場合は、解析された形式でパス名を指定する必要があります。 ~からlsof(8) マニュアル:

開くファイルは、汎用ファイル、ディレクトリ、ブロック特殊ファイル、文字特殊ファイル、実行可能テキスト参照、ライブラリ、ストリーム、またはネットワークファイル(インターネットソケット、NFSファイル、またはUNIXドメインソケット)です。パスごとにファイルを選択するか、ファイルシステム内のすべてのファイルを選択できます。

もちろん、次のエラーがある可能性があります。パス名が長すぎます。、この場合、パス名は解析されませんが、明らかに次のlsofように異なります。周囲のラッパー機能readlink()、その仕事をしなければなりません。

次のようにファイル名を指定する場合lsof [options] [--] names:

名前リストする特定のファイルのパス名。シンボリックリンクは使用前に解決されます。 「--」オプションを使用して、以前のオプションと名前を区別できます。

もちろん、ファイル名の解析に標準的な規則が適用されます。シンボリックリンクレベルが多すぎます。エラーが発生しましたlsofMAXSYMLINKS変数によって異なる 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_PEERlinux/unix_udiag.hlsof

注:この例では、UnixソケットをサポートするncDebianパッケージを使用しています。netcat-openbsd

関連情報