lsof コマンドは、開いているファイル、ソケット、およびパイプを一覧表示します。 lsof コマンドを使用して、開かれているファイル (ライブラリやログ ファイルなど) と、デーモンがリッスンしているポートを確認できます。 lsof コマンドを使用して、開いているファイルを検索できます。開いているすべてのファイルを表示するには、スーパーユーザー (root) として lsof を実行する必要があります。引数/オプションなしで使用すると、lsof は現在アクティブなプロセスで開いているすべてのファイルを一覧表示します。
# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 150352 4587561 /sbin/init (deleted) init 1 root DEL REG 253,0 4849693 /lib64/libnss_files-2.12.so ..........
「lsof」コマンドの出力を理解する:
COMMAND: Command using the file. PID: PID of the file USER: Owner of the file FD: File descriptor. Different flags of File descriptor are as below: # : The number in front of flag(s) is the file descriptor number used by the process to associate with the file u : File open with Read and Write permission r : File open with Read permission w : File open with Write permission W : File open with Write permission and with Write Lock on entire file mem : Memory mapped file, usually for shared library TYPE: File type. Different flags of File type are as below: REG - Regular file DIR - Directory DEVICE: major, minor number of the device where file resides. SIZE/OFF: File size NODE: inode number NAME: File name
マウント ポイントで開いているファイルを見つける
特定のディレクトリの下にある開いているファイルは、lsof を使用して見つけることができます。たとえば、vi を使用して編集するためにディレクトリの下のテキスト ファイルを開き (閉じないで、開いたままにしておきます)、別のセッションでそのディレクトリの下の lsof 出力を確認します。
# cd /test # vi a.txt
別のセッションで、そのディレクトリの下の lsof 出力を確認します:
# lsof /test COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 2972 root cwd DIR 253,0 4096 262145 /test vi 3012 root cwd DIR 253,0 4096 262145 /test
これは、使用中のマウント ポイントをアンマウントするためにも使用できます。マウント ポイントをビジー状態にしているプロセスは、lsof を使用して見つけることができます。
特定のプロセスに関する情報を見つける
特定のプロセスの詳細については、lsof に -p オプションを使用してください:
# lsof -p 8797
リッスン アドレスを表示
デーモンは、グローバル 0.0.0.0 IPv4 アドレス、または 127.0.0.1 (localhost) などの特定のアドレスにバインドできます。 localhost アドレスにバインドされたデーモンは、システム自体からのみ到達可能です。 -i および -nP オプションを lsof に使用して、ホスト名とサービスを検索せずにリスニング ポートを表示します。たとえば、次の例は、Apache httpd デーモンが localhost の非標準ポート 7777 で実行されていることを示しています。他のシステムは、この httpd プロセスに接続できません。セキュリティには適していますが、リモート接続には適していません。
例:
# lsof -i -nP | grep httpd httpd 8616 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN) httpd 8614 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN) httpd 8623 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN)
例:
対照的に、次の OpenSSH sshd プロセスは、ポート番号の前にある * で示されるように、0.0.0.0 アドレスにバインドされているため、他のシステムからの接続を受け入れます。
# lsof -i -P | grep sshd sshd 4341 root 3u IPv4 46438 TCP *:22 (LISTEN)
特定のアプリケーションは、Berkeley Internet Name Daemon (BIND) 名前付きデーモン バージョン 9 など、多くの異なるポートでリッスンします。
例:
# lsof -i -nP | grep ^named named 9865 named 5u IPv6 0x03348be0 0t0 UDP *:53 named 9865 named 6u IPv6 0x0566re80 0t0 TCP *:53 (LISTEN) named 9865 named 7u IPv4 0x03456b10 0t0 UDP 127.0.0.1:53 named 9865 named 8u IPv4 0x01870570 0t0 TCP 127.0.0.1:53 (LISTEN) named 9865 named 9u IPv4 0x03456a40 0t0 UDP *:49164 named 9865 named 10u IPv6 0x03456970 0t0 UDP *:49165 named 8888 named 11u IPv4 0x0186fd54 0t0 TCP *:953 (LISTEN) named 8888 named 13u IPv4 0x01387ee0 0t0 UDP 168.1.863.1:67 named 8888 named 14u IPv4 0x099899ce4 0t0 TCP 168.1.863.1:67(LISTEN)
プロセスによって開かれたファイルを見つける
プロセスは、ファイアウォール、tcp_wrappers などのアクセス サービス コントロール、またはその他の構成ミスなど、他の理由で機能しない場合があります。 ping、telnet、または nmap を使用して、リモート システムから、他の何かが要求をブロックしていないかどうかを確認するか、tcpdump を実行して、接続がソースを離れたか、ターゲット システムに到達したかどうかを確認します。
例
名前が「t」で始まるプロセス (telnetd…) と bash によって開かれるファイルを確認するには。また、init によって開かれるファイルを確認するには、次のコマンドを使用します。
# lsof -c t # lsof -c bash # lsof -c init
例
名前が「testuser」で始まるプロセスによって開かれているファイルを確認し、所有者がユーザー「tom」であるプロセスを除外するには、次のコマンドを使用します:
# lsof -c testuser -u ^tom
ユーザーが開いたプロセスを見つける
ユーザー myuser と tom が開いているプロセスを確認するには、次のコマンドを使用します:
# lsof -u myuser,tom
プロセスが使用するポートを見つける
特定のポートを使用しているプロセスを確認するには、次のコマンドを使用します:
# lsof -i TCP:389
開いているファイルの数でソートされたプロセス名とプロセス pid の開いているファイルの数を見つける方法
これは、「開いているファイルが多すぎます」というエラーが発生した場合に興味深いことがあります。 lsof コマンドを利用する以下のスクリプトを使用してください:
# lsof | perl -lane '$x{"$F[0]:$F[1]"}++;END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}'
Max ファイル記述子を使用してプロセスを見つける
ファイル記述子の制限は、シェルに対して次のコマンドを使用して設定できます:
# ulimit -n 65536
「lsof」コマンドを使用して、システム上のファイル記述子を使用しているものを見つけます。
# lsof -g | awk '{print $2}' | sort -u > /tmp/lsof_sort.txt
# for var in `cat /tmp/lsof_sort.txt` do echo `echo "$var ---- "``grep -x $var /tmp/lsof.txt | wc -l` done
これにより、すべてのプロセスと、それらによって開かれた対応するファイル数が一覧表示されます。開いているファイルの数が最も多いプロセスを選択して、それらが何であるかを確認できます。