lsofは、現在のシステムで開いているファイルを一覧表示するツールです。Linux環境では、すべてがファイルの形で存在し、ファイルを介して通常のデータにアクセスできるだけでなく、ネットワーク接続やハードウェアにもアクセスできます。伝送制御プロトコル(TCP)ソケットやユーザーデータグラムプロトコル(UDP)ソケットなど、システムはアプリケーションのファイル記述子をバックグラウンドで割り当てます。ファイルの性質に関係なく、ファイル記述子はアプリケーションと基本的なオペレーティングシステム間の相互作用は、共通のインターフェイスを提供します。アプリケーションのオープンファイル記述子リストは、アプリケーション自体に関する多くの情報を提供するためです。したがって、lsofツールはこのリストを表示して、システムを監視およびトラブルシューティングできます。
出力情報の意味
端末でlsofと入力すると、システムによって開かれたファイルが表示されます。lsofはコアメモリとさまざまなファイルにアクセスする必要があるため、その機能を完全に発揮させるにはrootユーザーとして実行する必要があります。
[root@queen ~]# lsof /root/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
aliyun-se 757 root cwd DIR 253,1 4096 131073 /root
bash 17433 root cwd DIR 253,1 4096 131073 /root
lsof 17460 root cwd DIR 253,1 4096 131073 /root
lsof 17461 root cwd DIR 253,1 4096 131073 /root
各行には開いているファイルが表示されます。条件が指定されていない場合、デフォルトでは、すべてのプロセスで開いているすべてのファイルが表示されます。
情報の各列を出力するlsofの意味は次のとおりです。
コマンド:プロセス名PID:プロセス識別子
USER:プロセス所有者
FD:ファイル記述子。アプリケーションは、ファイル記述子を通じてファイルを識別します。cwd、txtなど。TYPE:DIR、REGなどのファイルタイプ。
DEVICE:ディスクの名前を指定します
SIZE:ファイルのサイズ
NODE:Inode(ディスク上のファイルの識別)
NAME:開かれたファイルの正確な名前
lsof共通オプションの意味
lsof filename #显示打开指定文件的所有进程
lsof -c 进程 -c 进程 #显示指定进程名现在打开的文件,可以同时列出多个程序的
lsof -p pid1,pid2... #查看指定进程号的进程打开了哪些文件
lsof -i #列出所有的网络连接
lsof -i[:service|port] #列出谁在使用某个特定的tcp/udp端口
service --> /etc/service中的 service name (可以不只一个)
port --> 端口号 (可以不只一个)
lsofの使用例
削除されたファイルを回復する
(1.1)プロセスがシステム内のファイルを開いたが、このファイルが誤って削除された場合、現時点では、誤って削除されたファイルを復元したいと考えています。誤って削除されたファイルに対応するプロセスが閉じられない場合、ファイルを回復できます。
(1.2)LinuxのFDファイル記述子は、Windowsのファイルハンドルと同じ概念です。プロセスがファイルを開き、対応するファイル記述子が生成されます。プロセスがファイルを閉じると、ファイル記述子または、それに応じてファイルハンドルが解放されます。
(1.3)本番環境での一般的な問題は、一部の保守担当者または開発担当者がtailコマンドを使用してログをリアルタイムで表示することです。次に、別の人がrmコマンドを使用して削除します。これにより、削除するファイルとプロセスが使用中であり、ファイルハンドルが解放されないため、ディスク領域は実際には解放されません。つまり、末尾です。
ファイルとは
- ファイルは実際にはiノードへのリンクです。iノードリンクには、権限や所有者、データブロックアドレス(ファイルはディスク上のこれらのデータブロックに保存されます)など、ファイルのすべての属性が含まれます。ファイルを削除(rm)すると、 iノードへのリンクは削除され、iノードのコンテンツは削除されません。プロセスはまだ使用されている可能性があります。iノードのすべてのリンクが完全に削除された場合にのみ、これらのデータブロックは新しいデータを書き込むことができます。
- procファイルシステムは、データの回復に役立ちます。システム上の各プロセスには、/ procにディレクトリと独自の名前があり、fd(ファイル記述子)サブディレクトリが含まれています(プロセスには、ファイルを開くためのすべてのリンクが必要です)。ファイルシステムからファイルを削除するために、iノード参照もあります。
/proc/进程号/fd/文件描述符
開いているファイルのプロセス番号(pid)とファイル記述子(fd)を知っている必要があります。これらは、lsofツールで簡単に取得できます。
lsofコマンドを使用してトラブルシューティングを行う
- ファイル名がわかっている場合は、次のコマンドを直接使用できます
lsof |grep file
- しかし、どのファイルが不明な場合、または多くのファイルにこの状況がある場合は、次のコマンドを使用する必要があります
lsof |grep deleted
- killコマンドを使用してファイルハンドルを解放し、スペースを解放します
/ var / log / messagesを誤って削除したとします。
[root@queen home]# lsof | grep deleted
rsyslogd 759 root 4w REG 253,1 268564 264140 /var/log/messages (deleted)
in:imjour 759 781 root 4w REG 253,1 268564 264140 /var/log/messages (deleted)
rs:main 759 782 root 4w REG 253,1 268564 264140 /var/log/messages (deleted)
## 4是句柄号
[root@queen home]# ls -l /proc/759/fd/4
l-wx------ 1 root root 64 Oct 10 15:56 /proc/759/fd/4 -> /var/log/messages (deleted)
[root@queen home]# cp /proc/759/fd/4 /var/log/message
[root@queen home]# ls -l /var/log/message
-rw------- 1 root root 268564 Mar 5 14:16 /var/log/message