システム管理者として、新しいアプリケーションのログファイルパスがわからない場合があります。システムによっては、同じものを見つける方法が複数ある場合があります。システムで開いているログファイルのリストを取得するさまざまな方法を共有してください。
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
を実行して、たとえば、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
と同様に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"
pfiles
コマンドを使用して、ログファイルなど、プロセスが開いているファイルを確認します。出力をgrepすると、プロセス(スナップショットの時点)でログファイルが開いているかどうかを確認できます。
このページの他の回答について:
Solarisには、すぐに使用できるpstree
やlsof
のようなものはありません。
pstree。このツールはほとんどのLinuxにあります。これは実際にはSolarisptree
コマンドと非常によく似ています。実際、pstree
はSolarisptree
から発想を得たものだとどこかで読んだことがあります。 Solarisでpstree
を機能させることができると確信していますが、ptree
コマンドを使用したときにそのポイントを理解できるかどうかはわかりません。
lsof。このツールは、Solarisではネイティブに使用できません。確かにそれを見つけることができますが、前回私が調べたときは、文書化されていないハックを使用してSolarisでトリックを実行しました。また、前回見たときはグローバルゾーンでしか機能しませんでした。 Solarisに最も近い同等のものはpfiles
です。
以下を使用して、開いている.log
ファイルのシステム全体のリストを取得します。
lsof | grep "\.log$" | awk '{print $NF}' | sort -u
私が使用するプロセスの.log
ファイルのリストを取得するには:
pfiles <PID> | grep "\.log$" | sort -u
また、これを行うより効率的な方法があるかどうか教えてください..