lsof:1行にカスタムフィールドを印刷します。

lsof:1行にカスタムフィールドを印刷します。

-Fオプションを使用して、lsof印刷するフィールドを指定できます。

lsof -w -F pcfn

ただし、出力は各フィールドに 1 つずつ複数行に分割されます。

p23022
csleep
fcwd
n/home/testuser
frtd
n/
ftxt
n/usr/bin/sleep
fmem
n/usr/lib/locale/locale-archive
fmem
n/usr/lib/x86_64-linux-gnu/libc-2.28.so
fmem
n/usr/lib/x86_64-linux-gnu/ld-2.28.so
f0
n/dev/pts/20
f1
n/dev/pts/20
f2
n/dev/pts/20

1行にカスタムフィールドを印刷する方法は?

答え1

出力はlsof -F後処理が可能です。

AFAICT、バックスラッシュ、および制御文字(TABおよび改行文字を含む)は、少なくともいくつかの記号(ここではそれぞれバックスラッシュ、TAB、および改行文字を意味します)改行)²のlsofあるフィールドの1つで見つかったときにレンダリングされるため、次のことが可能です。 。開いているファイルごとに、次のようにタブで区切られた値と引き続き後処理できる値を使用して、この出力形式を指定します。\x\\\t\n

LC_ALL=C lsof -w -F pcfn | LC_ALL=C awk -v OFS='\t' '
  {t = substr($0, 1, 1); f[t] = substr($0, 2)}
  t == "n" {print f["p"], f["c"], f["f"], f["n"]}'

サンプルでは、​​以下を提供します。

23022   sleep   cwd /home/testuser
23022   sleep   rtd /
23022   sleep   txt /usr/bin/sleep
23022   sleep   mem /usr/lib/locale/locale-archive
23022   sleep   mem /usr/lib/x86_64-linux-gnu/libc-2.28.so
23022   sleep   mem /usr/lib/x86_64-linux-gnu/ld-2.28.so
23022   sleep   0   /dev/pts/20
23022   sleep   1   /dev/pts/20
23022   sleep   2   /dev/pts/20

lsof -w -F pcfn -a -d3 -p "$!":

perl -e '$0 = "a\nb\t"; sleep 999' 3> $'x\ny z\tw' &

これは以下を提供します:

7951    a\nb\t  3   /home/stephane/x\ny z\tw

この出力から実際のファイルn名を取得するには、まだシーケンスをデコードする必要があります\x

気づくこのlsofコマンドを使用すると、各プロセスの各スレッドの履歴を取得できます。しかし、フィールドリストにスレッドIDが含まれていないため、プロセス内のどのスレッドがファイルを開いたかわかりません。同じプロセスのスレッドには他のオープンファイルがほとんどないため、問題ではないかもしれませんが、それでも意味は次のとおりです。あなたはそこにいるでしょう。パイプで削除できる重複項目がありますLC_ALL=C sort -u。 lsof 4.90以降を使用することもできます-Ki

以下を含めることもできます。タイプドメインは解釈方法を知っています。名前大地。開いているファイルが削除されたときに追加するlsofことに注意してください (deleted)。そして、私が知っている限り、名前が終わるファイルからそれを明確に区別するための明確な方法はありません。 (deleted)


lsof¹これは必ずしも改行文字を含むファイル名を安全に処理できるわけではありません。たとえば、Linuxではまだ/proc/net/unixnetlinkの代わりに古いAPIを使用してUnix / Abstract Domain Socketに関する情報を取得し、ソケットファイルパスに改行文字が含まれているとAPIは完全に中断されます。偽のファイルパスを使用してソケットにバインドすると、プロセスが他のソケットではlsofなく特定のソケットが開いていると簡単に信じることができます。

²非制御文字を保持しますが、α一部のロケール(BIG5の0xa3 0x5cなど)では、一部の文字のエンコードにはバックスラッシュエンコーディングでもある0x5cバイトが含まれています。したがって、ここでは、\xHH後処理中に予期しない状況を避けるために、0x7f以上のすべてのバイトがレンダリングされるようにロケールをCに強制します。

答え2

Awkは私のお気に入りのハンマーです。

  • 値が常に提供されるわけではないので、フィールドに一致する名前の変数を使用して「-」で初期化します。
  • 「n」が最後かどうかによって異なります。それまでにすべてのフィールドを見たと仮定すると、これを確認すると印刷がトリガーされます。もちろん、印刷順序は何でもよい。
lsof -w -F pcfn|awk '
BEGIN {
        p=c=f=n="-"
}
# extract field & value for every line
{field=substr($0,1,1); value=substr($0,2)}
# assign value to matching variable name
/^p/{p=value}
/^c/{c=value}
/^f/{f=value}
/^n/{n=value
        print p,c,f,n
        p=c=f=n="-"
}
'

結果は次のとおりです。

1 systemd cwd /
- - rtd /
- - txt /usr/lib/systemd/systemd
- - mem /lib64/libm-2.26.so
and so on...

答え3

p必要なものがf各PID(field)または各フィールド記述子(field)の出力のみである場合一つワイヤー。マニュアルに記載されている内容を試すことができます。

たとえば、-F pcfn'' will select the process ID (`p'), command name (`c'), file descriptor (`f') and file name (`n') fields with an NL field terminator character;-F pcfn0 ''は、NUL(000)フィールド終端を持つ同じ出力を選択します。

lsof -w -F pcfn0

pf各グループまたはグループに1行(NULを含む)を印刷します。 Less を使用して出力を表示できます。マニュアルには次のように記載されているため、すべてのフィールドが表示されるわけではありません。

Lsofは、各プロセスまたはファイルセットのすべてのフィールドを生成せず、使用可能なフィールドのみを生成します。

しかし、明らかに、-Fオプションは次のデータを転送するために使用されます。その他のプログラム。マニュアルによると:

lsofは、表示用の形式以外のプログラムから解析できる出力を生成します。詳細については、-F、オプションの説明、および他のプログラムの出力セクションを参照してください。

したがって、選択の余地はなく、lsofの出力は他のプログラムで処理する必要があります。過去にacプログラムやawkスクリプトを使用したことがあります。 lsof出力を正しく処理する方法のawkの例は、スクリプトディレクトリにあります。

 /usr/share/doc/lsof/examples/list_fields.awk

https://github.com/Distrotech/lsof/blob/master/scripts/list_fields.awkまたは、例えば。

またlsofディストリビューションlsof_fields.hにはlsof

これがあなたがしなければならないことのようです。これは、各フィールド(行)の最初の文字(提供されたフィールドの識別子)を解析し、それらをすべて印刷できる単一のテーブルにリンクすることを意味します。

この回答lsofの出力を解析する方法を示しました。

答え4

awkいいですね。しかし、あまり知られていない代替コマンドを提供したいと思います。pr。このコマンドのテキスト分割機能を次のように組み合わせました。columnこのコマンドは、美しくカスタマイズ可能な形式で出力を表示します。

lsof -w -F pcfn / | pr --column 4 --across | column

4これのもう1つの利点は、興味のあるフィールドの数に数字を一致させるだけで、興味のある出力に応じて簡単に変更できることです。

以下は出力の例です。

p1682             cPM2 v5.2.0: God  fcwd              n/
frtd              n/                ftxt              n/home/aaron/.nvm
fmem              n/usr/lib/x86_64- fmem              n/usr/lib/x86_64-
fmem              n/usr/lib/x86_64- fmem              n/usr/lib/x86_64-
fmem              n/usr/lib/x86_64- fmem              n/usr/lib/x86_64-

pr必要に応じてカスタム区切り文字を指定して、次のような出力を提供することもでき、必要に応じてカスタマイズできます。例:

lsof -w -F pcfn / | head -20 | pr -ts' ' --column 4 -a

出力:

p1682 cPM2 v5.2.0: God fcwd n/
frtd n/ ftxt n/home/aaron/.nvm/versions/node/v16.14.2/bin/node
fmem n/usr/lib/x86_64-linux-gnu/libnss_dns-2.31.so fmem n/usr/lib/x86_64-linux-gnu/libresolv-2.31.so
fmem n/usr/lib/x86_64-linux-gnu/libc-2.31.so fmem n/usr/lib/x86_64-linux-gnu/libpthread-2.31.so
fmem n/usr/lib/x86_64-linux-gnu/libgcc_s.so.1 fmem n/usr/lib/x86_64-linux-gnu/libm-2.31.so

関連情報