web-dev-qa-db-ja.com

* nix内の開いているすべての「.log」ファイルを一覧表示します

システム管理者として、新しいアプリケーションのログファイルパスがわからない場合があります。システムによっては、同じものを見つける方法が複数ある場合があります。システムで開いているログファイルのリストを取得するさまざまな方法を共有してください。

3
Kent Pawar

ユーザーXファイル

1人のユーザーの開いているファイルだけを表示する必要がある場合:

$ lsof -u<user>

または、テキストファイル記述子を持つファイル(通常は実際のファイル)のみ:

$ lsof -a -u<user> -d txt

ユーザーsamlが使用しているすべてのファイル。

$ lsof -usaml
COMMAND     PID USER   FD   TYPE             DEVICE  SIZE/OFF       NODE NAME
vim        1341 saml  cwd    DIR              253,2      4096   10370078 /home/saml/mp3s
vim        1341 saml  rtd    DIR              253,0      4096          2 /
vim        1341 saml  txt    REG              253,0   2105272    1215334 /usr/bin/vim
vim        1341 saml  mem    REG              253,0    237616     393586 /lib64/libgssapi_krb5.so.2.2

テキスト記述子を使用し、ユーザーsamlが所有するファイルのみ。

$ lsof -a -usaml -d txt
      Output information may be incomplete.
COMMAND     PID USER  FD   TYPE DEVICE SIZE/OFF     NODE NAME
vim        1341 saml txt    REG  253,0  2105272  1215334 /usr/bin/vim
bash       1468 saml txt    REG  253,0   940312  2490450 /bin/bash
gvfsd-htt  1777 saml txt    REG  253,0   179528  1209465 /usr/libexec/gvfsd-http
gnome-key  2051 saml txt    REG  253,0   953664  1214068 /usr/bin/gnome-keyring-daemon
...

ルートとしてのlsof

通常は、昇格された特権でlsofを実行して、たとえば、Apacheプロセスまたはルートが所有するシステム上のすべてのファイルを表示する必要があります。

$ Sudo lsof  

lsofを逆方向に使用して、特定のファイルを開いたプロセスを確認することもできます。

$ Sudo lsof /var/log/messages
      Output information may be incomplete.
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
rsyslogd 1266 root    4w   REG  253,0   372306 1973825 /var/log/messages

トップとしてのlsof

lsofと同様にtopを使用して、秒数ごとにポーリングし、システムで何が起こっているかを表示することもできます。

$ Sudo lsof -u saml -c sleep -a -r5

-c ...引数は、名前に文字列...が含まれるプロセスのみを表示します。ここでは、コマンドsleepを使用してこれを示しています。 5秒ごとにポーリングするlsofコマンドを実行し、文字列sleepを含むプロセスによって開かれたファイルを表示します。次に、別の端末でsleep 5を実行しました。

$ Sudo lsof -u saml -c sleep -a -r5
      Output information may be incomplete.
=======
=======
=======
=======
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
sleep   10780 saml  cwd    DIR  253,2    32768 10354689 /home/saml
sleep   10780 saml  rtd    DIR  253,0     4096        2 /
sleep   10780 saml  txt    REG  253,0    27912  2490470 /bin/sleep
sleep   10780 saml  mem    REG  253,0   151456   393578 /lib64/ld-2.13.so
sleep   10780 saml  mem    REG  253,0  1956608   393664 /lib64/libc-2.13.so
sleep   10780 saml  mem    REG  253,0 99158752  1209621 /usr/lib/locale/locale-archive
sleep   10780 saml    0u   CHR 136,59      0t0       62 /dev/pts/59
sleep   10780 saml    1u   CHR 136,59      0t0       62 /dev/pts/59
sleep   10780 saml    2u   CHR 136,59      0t0       62 /dev/pts/59
=======
=======
=======
=======

ログファイル

lsofを使用すると、上記の出力のいずれかを取得して、何が起こっているのかを確認したいログファイルの名前をgrepするだけでログファイルを見つけることができます。

$ lsof .... | grep "log file name"
3
slm

Solaris10およびSolaris11の場合

pfilesコマンドを使用して、ログファイルなど、プロセスが開いているファイルを確認します。出力をgrepすると、プロセス(スナップショットの時点)でログファイルが開いているかどうかを確認できます。

このページの他の回答について:

Solarisには、すぐに使用できるpstreelsofのようなものはありません。

  • pstree。このツールはほとんどのLinuxにあります。これは実際にはSolarisptreeコマンドと非常によく似ています。実際、pstreeはSolarisptreeから発想を得たものだとどこかで読んだことがあります。 Solarisでpstreeを機能させることができると確信していますが、ptreeコマンドを使用したときにそのポイントを理解できるかどうかはわかりません。

  • lsof。このツールは、Solarisではネイティブに使用できません。確かにそれを見つけることができますが、前回私が調べたときは、文書化されていないハックを使用してSolarisでトリックを実行しました。また、前回見たときはグローバルゾーンでしか機能しませんでした。 Solarisに最も近い同等のものはpfilesです。

1
unixhacker2010

以下を使用して、開いている.logファイルのシステム全体のリストを取得します。

lsof | grep "\.log$" | awk '{print $NF}' | sort -u

私が使用するプロセスの.logファイルのリストを取得するには:

pfiles <PID> | grep "\.log$" | sort -u

また、これを行うより効率的な方法があるかどうか教えてください..

1
Kent Pawar