ファイルやポート、プロセスの関連を確認する際に良く利用するlsofコマンドについて、個人的に覚えておきたいオプションや使い方をまとめてみる事にする。
なお、もしlsofコマンドがない環境の場合、ファイルとプロセスの紐付けを確認するだけであればfuserコマンドが入っていればそれで代用可能だ。
1.全プロセスを確認する
lsofコマンドは、オプションを付与しないで実行すると全てのプロセスについて出力してくれる。
lsof
[root@test-node ~]# lsof
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 4096 128 /
systemd 1 root rtd DIR 253,0 4096 128 /
systemd 1 root txt REG 253,0 1489960 196956 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20032 201382954 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,0 252704 201609186 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,0 90632 201382920 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,0 19888 201524817 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,0 19520 201328490 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,0 153192 201328867 /usr/lib64/liblzma.so.5.0.99
systemd 1 root mem REG 253,0 398272 201328924 /usr/lib64/libpcre.so.1.2.0
systemd 1 root mem REG 253,0 2107816 201328483 /usr/lib64/libc-2.17.so
systemd 1 root mem REG 253,0 142304 201328516 /usr/lib64/libpthread-2.17.so
systemd 1 root mem REG 253,0 88720 201326729 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd 1 root mem REG 253,0 44096 201328521 /usr/lib64/librt-2.17.so
systemd 1 root mem REG 253,0 260784 201673504 /usr/lib64/libmount.so.1.1.0
systemd 1 root mem REG 253,0 91768 201566273 /usr/lib64/libkmod.so.2.2.10
systemd 1 root mem REG 253,0 118792 201382927 /usr/lib64/libaudit.so.1.0.0
systemd 1 root mem REG 253,0 61648 201649973 /usr/lib64/libpam.so.0.83.1
systemd 1 root mem REG 253,0 20024 201524821 /usr/lib64/libcap.so.2.22
systemd 1 root mem REG 253,0 147120 201382917 /usr/lib64/libselinux.so.1
systemd 1 root mem REG 253,0 164440 202444375 /usr/lib64/ld-2.17.so
systemd 1 root 0u CHR 1,3 0t0 1028 /dev/null
systemd 1 root 1u CHR 1,3 0t0 1028 /dev/null
…
出力されている情報について、左から順に
- COMMAND … 実行されているコマンド
- PID … プロセスID
- TID … スレッドID
- USER … 実行ユーザ
- FD … ファイルディスクリプタ。主に見かけるものだけ抜粋。
- cwd … カレントディレクトリ
- txt … テキストファイル
- mem … メモリマッピングファイル
- mmap … メモリマッピングデバイス
- ◯uなど … 実際のファイルディスクリプタを表す。数字以降のアルファベットの意味は、r→読み取り、w→書き込み、u→読み書き
- TYPE … タイプ。主に見かけるものだけ抜粋。
- REG … 通常ファイル
- DIR … ディレクトリ
- FIFO … FIFO
- CHR … デバイスファイル
- unix … UNIXドメインソケット
- IPv4 … IPv4ソケット
- IPv6 … IPv6ソケット
- DEVICE … デバイス
- SIZE/OFF … ファイルサイズ
- NODE … プロトコル
- NAME … ファイルまたはポート
2.対象のファイル(ディレクトリ)を指定する
以下のようにコマンドを実行することで、ファイルやディレクトリを指定して出力させる事ができる。
lsof ファイルPATH
[root@test-node ~]# lsof /var/lib/mysql/tc.log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1203 mysql mem REG 253,0 24576 635783 /var/lib/mysql/tc.log
mysqld 1203 mysql 16u REG 253,0 24576 635783 /var/lib/mysql/tc.log
ディレクトリ配下を再帰的に確認する場合は、「+D」を付与する。
lsof +D ディレクトリPATH
[root@test-node ~]# lsof +D /var/lib/mysql/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1203 mysql cwd DIR 253,0 4096 635772 /var/lib/mysql
mysqld 1203 mysql mem REG 253,0 24576 635783 /var/lib/mysql/tc.log
mysqld 1203 mysql 3uW REG 253,0 52 635785 /var/lib/mysql/aria_log_control
mysqld 1203 mysql 4r DIR 253,0 4096 635772 /var/lib/mysql
mysqld 1203 mysql 5u REG 253,0 16384 635787 /var/lib/mysql/aria_log.00000001
mysqld 1203 mysql 6uW REG 253,0 12582912 635788 /var/lib/mysql/ibdata1
mysqld 1203 mysql 11uW REG 253,0 50331648 635789 /var/lib/mysql/ib_logfile0
mysqld 1203 mysql 12uW REG 253,0 50331648 635791 /var/lib/mysql/ib_logfile1
mysqld 1203 mysql 13uW REG 253,0 98304 639741 /var/lib/mysql/mysql/innodb_index_stats.ibd
mysqld 1203 mysql 15uW REG 253,0 98304 639739 /var/lib/mysql/mysql/innodb_table_stats.ibd
mysqld 1203 mysql 16u REG 253,0 24576 635783 /var/lib/mysql/tc.log
mysqld 1203 mysql 17u REG 253,0 1024 924937 /var/lib/mysql/mysql/servers.MYI
mysqld 1203 mysql 18u REG 253,0 0 924938 /var/lib/mysql/mysql/servers.MYD
mysqld 1203 mysql 20u unix 0xffff880035f80000 0t0 19543 /var/lib/mysql/mysql.sock
mysqld 1203 mysql 21u REG 253,0 4096 924925 /var/lib/mysql/mysql/user.MYI
mysqld 1203 mysql 22u REG 253,0 668 924926 /var/lib/mysql/mysql/user.MYD
mysqld 1203 mysql 23u REG 253,0 9216 797673 /var/lib/mysql/mysql/db.MYI
mysqld 1203 mysql 24u REG 253,0 1264 797674 /var/lib/mysql/mysql/db.MYD
mysqld 1203 mysql 25u REG 253,0 2048 797677 /var/lib/mysql/mysql/host.MYI
mysqld 1203 mysql 26u REG 253,0 0 797678 /var/lib/mysql/mysql/host.MYD
mysqld 1203 mysql 27u REG 253,0 10240 639743 /var/lib/mysql/mysql/proxies_priv.MYI
mysqld 1203 mysql 28u REG 253,0 2538 639744 /var/lib/mysql/mysql/proxies_priv.MYD
mysqld 1203 mysql 29u REG 253,0 4096 924928 /var/lib/mysql/mysql/roles_mapping.MYI
mysqld 1203 mysql 30u REG 253,0 0 924929 /var/lib/mysql/mysql/roles_mapping.MYD
mysqld 1203 mysql 31u REG 253,0 4096 924940 /var/lib/mysql/mysql/tables_priv.MYI
mysqld 1203 mysql 32u REG 253,0 0 924941 /var/lib/mysql/mysql/tables_priv.MYD
mysqld 1203 mysql 33u REG 253,0 4096 924943 /var/lib/mysql/mysql/columns_priv.MYI
mysqld 1203 mysql 34u REG 253,0 0 924944 /var/lib/mysql/mysql/columns_priv.MYD
mysqld 1203 mysql 35u REG 253,0 4096 639727 /var/lib/mysql/mysql/procs_priv.MYI
mysqld 1203 mysql 36u REG 253,0 0 639728 /var/lib/mysql/mysql/procs_priv.MYD
mysqld 1203 mysql 37u REG 253,0 2048 639736 /var/lib/mysql/mysql/event.MYI
mysqld 1203 mysql 38u REG 253,0 0 639737 /var/lib/mysql/mysql/event.MYD
mysqld 1203 mysql 39uW REG 253,0 98304 639755 /var/lib/mysql/mysql/gtid_slave_pos.ibd
mysqld 1203 mysql 40u REG 253,0 0 639764 /var/lib/mysql/multi-master.info
3.実行コマンドを指定する
「-c」で実行されているコマンドを指定して抽出することが出来る。
lsof -c コマンド名
[root@test-node ~]# lsof -c python
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 15214 dd-agent cwd DIR 253,0 4096 128 /
python 15214 dd-agent rtd DIR 253,0 4096 128 /
python 15214 dd-agent txt REG 253,0 6091728 3871161 /opt/datadog-agent/embedded/bin/python2.7
python 15214 dd-agent mem REG 253,0 27076 70543951 /opt/datadog-agent/embedded/lib/python2.7/lib-dynload/resource.so
…
複数のコマンドを指定する場合は、そのコマンド数だけ「-c」を付与してやれば良い。
これは他の条件でも同様なので、そこでは説明しない。
lsof -c コマンド名 -c コマンド名 ...
[root@test-node ~]# lsof -c python -c mysqld
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1203 mysql cwd DIR 253,0 4096 635772 /var/lib/mysql
mysqld 1203 mysql rtd DIR 253,0 4096 128 /
python 15214 dd-agent mem REG 253,0 24988 70543941 /opt/datadog-agent/embedded/lib/python2.7/lib-dynload/grp.so
python 15214 dd-agent mem REG 253,0 247235 142547834 /opt/datadog-agent/embedded/lib/libtinfow.so.5.9
…
なお、コマンド以外でも同様の指定方法になるが、検索条件の頭に「^」を付与する事で"それ以外"を検索することが出来る。
lsof -c ^コマンド名
4.ユーザを指定する
プロセスの実行ユーザを指定して出力させる場合は、「-u」オプションを付与する。
lsof -u ユーザ名
[root@test-node ~]# lsof -u dd-agent
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
superviso 15208 dd-agent cwd DIR 253,0 4096 128 /
superviso 15208 dd-agent rtd DIR 253,0 4096 128 /
superviso 15208 dd-agent txt REG 253,0 6091728 3871161 /opt/datadog-agent/embedded/bin/python2.7
…
5.プロセス番号を指定する
対象のプロセス番号を指定して出力させる場合は、「-p」オプションを用いる。
lsof -p プロセス番号
[root@test-node ~]# lsof -p 15208
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
superviso 15208 dd-agent cwd DIR 253,0 4096 128 /
superviso 15208 dd-agent rtd DIR 253,0 4096 128 /
superviso 15208 dd-agent txt REG 253,0 6091728 3871161 /opt/datadog-agent/embedded/bin/python2.7
superviso 15208 dd-agent mem REG 253,0 25313 70543955 /opt/datadog-agent/embedded/lib/python2.7/lib-dynload/syslog.so
…
6.ネットワークコネクションを出力する
ネットワークコネクションを出力させる場合、「-i」でポート番号を指定する。
lsof -i
[root@test-node ~]# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1203 mysql 19u IPv6 19542 0t0 TCP *:mysql (LISTEN)
sshd 1204 root 3u IPv4 17508 0t0 TCP *:ssh (LISTEN)
sshd 1204 root 4u IPv6 17517 0t0 TCP *:ssh (LISTEN)
snmpd 1348 root 6u IPv4 3264383 0t0 UDP *:snmp
…
ポート番号を指定する場合は、「-i:ポート番号」というふうに指定してやれば良い。
プロトコル名でもいける。
lsof -i:ポート番号
[root@test-node ~]# lsof -i:ssh
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1204 root 3u IPv4 17508 0t0 TCP *:ssh (LISTEN)
sshd 1204 root 4u IPv6 17517 0t0 TCP *:ssh (LISTEN)
sshd 6731 root 3u IPv4 39065001 0t0 TCP 172.28.XXX.XXX:ssh->172.28.XXX.XXX:58041 (ESTABLISHED)
[root@test-node ~]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1204 root 3u IPv4 17508 0t0 TCP *:ssh (LISTEN)
sshd 1204 root 4u IPv6 17517 0t0 TCP *:ssh (LISTEN)
sshd 6731 root 3u IPv4 39065001 0t0 TCP 172.28.XXX.XXX:ssh->172.28.XXX.XXX:58041 (ESTABLISHED)
「-i」の後にtcp/udpと、プロトコルを指定することも出来る。
lsof -i tcp
lsof -i udp
7.プロセス番号のみを出力させる
出力時の情報としてプロセス番号のみが必要な場合は、「-t」オプションを付与する。
lsof -t
[root@test-node ~]# lsof -t -i:22
1204
6731
8.検索条件を「AND」にする
lsofでは、複数の検索条件を指定するとOR検索をしてくれる。
[root@test-node ~]# lsof +D /var/ -u root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 4096 128 /
systemd 1 root rtd DIR 253,0 4096 128 /
systemd 1 root txt REG 253,0 1489960 196956 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20032 201382954 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,0 252704 201609186 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,0 90632 201382920 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,0 19888 201524817 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,0 19520 201328490 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,0 153192 201328867 /usr/lib64/liblzma.so.5.0.99
…
これをAND検索にするには、「-a」をオプションとして付与すればよい。
[root@test-node ~]# lsof +D /var/ -u root -a
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
auditd 593 root 4w REG 253,0 2295993 202406271 /var/log/audit/audit.log
rsyslogd 623 root 3w REG 253,0 27180 68261241 /var/log/cron
rsyslogd 623 root 4w REG 253,0 969666 68261243 /var/log/messages
rsyslogd 623 root 7w REG 253,0 653 68261244 /var/log/secure
wpa_suppl 817 root 3w REG 253,0 240 67818767 /var/log/wpa_supplicant.log
tuned 1201 root 3w REG 253,0 7501 67128544 /var/log/tuned/tuned.log
master 2870 root cwd DIR 253,0 4096 67587672 /var/spool/postfix
master 2870 root 10uW REG 253,0 33 202183803 /var/spool/postfix/pid/master.pid
master 2870 root 11uW REG 253,0 33 2017 /var/lib/postfix/master.lock
9.数秒ごとに繰り返し実行させる
「-r」オプションを付与することで、数秒ごとにlsofを再実行してくれる。秒数を指定する場合は、「-r秒」というふうに指定するとよい。
(デフォルトでは15秒)
[root@test-node ~]# lsof +D /var/ -u root -a -r1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
auditd 593 root 4w REG 253,0 2295993 202406271 /var/log/audit/audit.log
rsyslogd 623 root 3w REG 253,0 27180 68261241 /var/log/cron
rsyslogd 623 root 4w REG 253,0 971200 68261243 /var/log/messages
rsyslogd 623 root 7w REG 253,0 653 68261244 /var/log/secure
wpa_suppl 817 root 3w REG 253,0 240 67818767 /var/log/wpa_supplicant.log
tuned 1201 root 3w REG 253,0 7501 67128544 /var/log/tuned/tuned.log
master 2870 root cwd DIR 253,0 4096 67587672 /var/spool/postfix
master 2870 root 10uW REG 253,0 33 202183803 /var/spool/postfix/pid/master.pid
master 2870 root 11uW REG 253,0 33 2017 /var/lib/postfix/master.lock
=======
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
auditd 593 root 4w REG 253,0 2295993 202406271 /var/log/audit/audit.log
rsyslogd 623 root 3w REG 253,0 27180 68261241 /var/log/cron
rsyslogd 623 root 4w REG 253,0 971200 68261243 /var/log/messages
rsyslogd 623 root 7w REG 253,0 653 68261244 /var/log/secure
wpa_suppl 817 root 3w REG 253,0 240 67818767 /var/log/wpa_supplicant.log
tuned 1201 root 3w REG 253,0 7501 67128544 /var/log/tuned/tuned.log
master 2870 root cwd DIR 253,0 4096 67587672 /var/spool/postfix
master 2870 root 10uW REG 253,0 33 202183803 /var/spool/postfix/pid/master.pid
master 2870 root 11uW REG 253,0 33 2017 /var/lib/postfix/master.lock
=======
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
auditd 593 root 4w REG 253,0 2295993 202406271 /var/log/audit/audit.log
rsyslogd 623 root 3w REG 253,0 27180 68261241 /var/log/cron
rsyslogd 623 root 4w REG 253,0 971200 68261243 /var/log/messages
rsyslogd 623 root 7w REG 253,0 653 68261244 /var/log/secure
wpa_suppl 817 root 3w REG 253,0 240 67818767 /var/log/wpa_supplicant.log
tuned 1201 root 3w REG 253,0 7501 67128544 /var/log/tuned/tuned.log
master 2870 root cwd DIR 253,0 4096 67587672 /var/spool/postfix
master 2870 root 10uW REG 253,0 33 202183803 /var/spool/postfix/pid/master.pid
master 2870 root 11uW REG 253,0 33 2017 /var/lib/postfix/master.lock
=======
…