GNU/Linux >> Linux の 問題 >  >> Linux

lsof :最も一般的に使用される例

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

これにより、すべてのプロセスと、それらによって開かれた対応するファイル数が一覧表示されます。開いているファイルの数が最も多いプロセスを選択して、それらが何であるかを確認できます。


Linux
  1. Subversion チュートリアル:最もよく使用される 10 の SVN コマンドと例

  2. 最も頻繁に使用される 25 の Linux IPTables ルールの例

  3. Linux での ln コマンドの例

  1. [Linux]:最も頻繁に使用される15のYUMコマンドと例

  2. ファイル内で最も頻繁に使用されるN個の単語を検索しますか?

  3. Linux での file コマンドの例

  1. Linuxでのmvコマンド:7つの重要な例

  2. 7Linuxでのlsofコマンドの例

  3. Linuxテールコマンドの例