ファイルやポート、プロセスの関連を確認する際に良く利用する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
=======
…