Linuxはlsofコマンドを使用してファイルのオープンステータスを確認します

Linuxはlsofコマンドを使用してファイルのオープンステータスを確認します

序文

Linux では「すべてがファイル」であることは誰もが知っているので、ファイルのオープン状態を確認することが特に重要な場合があります。この問題で役立つコマンドは lsof です。

Linuxにはどんなファイルがあるか

lsof コマンドを紹介する前に、Linux の主なファイルについて簡単に説明しましょう。

  • 通常のファイル
  • 目次
  • シンボリックリンク
  • ブロック指向デバイスファイル
  • 文字指向デバイスファイル
  • パイプと名前付きパイプ
  • ソケット

上記のファイルタイプについては詳しく説明しません。

lsof コマンドの実践的な使い方の紹介

lsof は、list open files (開いているファイルのリスト) の略語です。これには多くのパラメータがありますが、ここではいくつかの実用的な使用法のみを紹介します (実行にはルート権限が必要な場合があることに注意してください)。

現在開いているすべてのファイルを表示

一般的に、lsof コマンドを直接入力すると結果が多すぎて、必要な情報を見つけるのが難しくなる可能性があります。ただし、この機会に、レコードにどのような情報が含まれているかを説明したいと思います。

$ lsof (ここで表示するレコードを選択してください)
コマンド PID ユーザー FD タイプ デバイス サイズ/オフ ノード名
vi 27940 hyb 7u REG 8,15 16384 137573 /home/hyb/.1.txt.swp

lsof によって表示される結果は、左から右に、ファイルを開くプログラムの名前、プロセス ID、ユーザー、ファイル記述子、ファイル タイプ、デバイス、サイズ、iNode 番号、ファイル名を表します。

今のところわかっている列に焦点を当ててみましょう。このレコードは、プロセス ID 27940 の vi プログラムが、/home/hyb ディレクトリ内の通常ファイル (REG 通常ファイル).1.txt.swap をファイル記述値が 7 で開き、読み取り/書き込み状態になっていることを示しています。現在のサイズは 16384 バイトです。

スペースを占有している削除済みファイルを一覧表示する

実稼働環境では、df コマンドを使用してディスク領域がいっぱいになっていることを確認することがありますが、実際には領域を占有しているファイルを見つけるのは困難です。これは、多くの場合、大きなファイルが削除されたが、プロセスによって開かれているため、通常の手段 (最も一般的なのはログ ファイル) ではその痕跡が見つからないことが原因です。このようなファイルは lsof を通じて見つけることができます:

$ lsof |grep 削除済み
Xorg 1131 root 125u REG 0,5 4 61026 /memfd:xshmfence (削除済み)
Xorg 1131 ルート 126u REG 0,5 4 62913 /memfd:xshmfence (削除済み)
Xorg 1131 root 129u REG 0,5 4 74609 /memfd:xshmfence (削除済み)

削除されたがまだ開いているファイルは、最終的に見つかったときに削除済みとしてマークされることがわかります。このとき、実際の状況に応じて、どのファイルが大きすぎるために削除されたのか、その結果スペースがまだいっぱいになっているのかを分析できます。

開いているが削除されたファイルを回復する

以前は、削除されたがまだ開いているファイルを見つけることができました。実際には、ファイルは完全には消えていませんでした。誤って削除された場合でも、復元する方法はまだあります。 /var/log/syslog ファイルを例にとると、まずそれを削除します (root ユーザー)。

$ rm /var/log/syslog

次に、lsof を使用して、どのプロセスがファイルを開いたかを確認します。

$ lsof |grep syslog
rs:main 993 1119 syslog 5w REG 8,10 78419 528470 /var/log/syslog (削除済み)

プロセス ID 993 のプロセスがファイルを開いたことがわかります。各プロセスには、/proc の下にファイル記述子を開いた記録があることがわかります。

$ ls -l /proc/993/fd
lr-x------ 1 ルート ルート 64 3月5日 18:30 0 -> /dev/null
l-wx------ 1 ルート ルート 64 3月5日 18:30 1 -> /dev/null
l-wx------ 1 ルート ルート 64 3月5日 18:30 2 -> /dev/null
lrwx------ 1 ルート ルート 64 3月5日 18:30 3 -> ソケット:[15032]
lr-x------ 1 ルート ルート 64 3月5日 18:30 4 -> /proc/kmsg
l-wx------ 1 root root 64 3月5日 18:30 5 -> /var/log/syslog (削除済み)
l-wx------ 1 root root 64 3月5日 18:30 6 -> /var/log/auth.log

ここで、削除された syslog ファイルを見つけます。ファイル記述子は 5 なので、これをリダイレクトします。

$ cat /proc/993/fd/5 > syslog
$ ls -al /var/log/syslog
-rw-r--r-- 1 ルート ルート 78493 3月5日 19:22 /var/log/syslog

このようにして syslog ファイルを復元しました。

現在のファイルを開いたプロセスを確認する

Windows では、ファイルを削除したい場合に、そのファイルがプログラムによって使用されていることは通知されるものの、それがどのプログラムであるかは通知されないという状況がよく発生します。リソース マネージャー - パフォーマンス - リソース モニター - CPU 関連ハンドルでファイルを検索して、ファイルを開くプログラムを見つけることができますが、検索速度は遅いです。

Linux は比較的簡単で、lsof コマンドを使用するだけです。たとえば、現在 hello.c を開いているプログラムを確認するには、次のようにします。

$ lsof hello.c
コマンド PID ユーザー FD タイプ デバイス サイズ/オフ ノード名
テール 28731 hyb 3r REG 8,15 228 138441 hello.c

しかし、vi で開いた hello.c は見つからないことがわかります。これは、vi が一時コピーを開くためです。別の方法で検索してみましょう:

$ lsof |grep hello.c
テール 28906 hyb 3r REG 8,15 228 138441 /home/hyb/workspaces/c/hello.c
vi 28933 hyb 9u REG 8,15 12288 137573 /home/hyb/workspaces/c/.hello.c.swp

このようにして、hello.c ファイルに関連する 2 つのプログラムが見つかりました。

ここでの grep の役割は、すべての結果から条件を満たす結果のみをリストすることです。

ディレクトリファイルが開かれているかどうかを確認する

$ lsof +D ./

現在のプロセスによって開かれているファイルを確認する

使用方法: lsof -c プロセス名

これは通常、現在のプロセスがどのライブラリを使用しているか、どのファイルが開かれているかなどを確認するなど、プログラムの問題を特定するために使用されます。ループ内で文字を出力する hello プログラムがあるとします。

$ lsof -c こんにちは
コマンド PID ユーザー FD タイプ デバイス サイズ/オフ ノード名
こんにちは 29190 hyb cwd DIR 8,15 4096 134538 /home/hyb/workspaces/c
こんにちは 29190 hyb rtd DIR 8,10 4096 2 /
hello 29190 hyb txt REG 8,15 9816 138314 /home/hyb/workspaces/c/hello
こんにちは 29190 hyb メモリ REG 8,10 1868984 939763 /lib/x86_64-linux-gnu/libc-2.23.so
こんにちは 29190 hyb メモリ REG 8,10 162632 926913 /lib/x86_64-linux-gnu/ld-2.23.so
こんにちは 29190 hyb 0u CHR 136,20 0t0 23 /dev/pts/20
こんにちは 29190 hyb 1u CHR 136,20 0t0 23 /dev/pts/20
こんにちは 29190 hyb 2u CHR 136,20 0t0 23 /dev/pts/20

このことから、少なくとも /lib/x86_64-linux-gnu/libc-2.23.so と hello ファイルが使用されていることがわかります。

プロセス ID 別に表示することも、カンマで区切って複数のプロセス ID を使用することもできます。

$ lsof -p 29190
コマンド PID ユーザー FD タイプ デバイス サイズ/オフ ノード名
こんにちは 29190 hyb cwd DIR 8,15 4096 134538 /home/hyb/workspaces/c
こんにちは 29190 hyb rtd DIR 8,10 4096 2 /
hello 29190 hyb txt REG 8,15 9816 138314 /home/hyb/workspaces/c/hello
こんにちは 29190 hyb メモリ REG 8,10 1868984 939763 /lib/x86_64-linux-gnu/libc-2.23.so
こんにちは 29190 hyb メモリ REG 8,10 162632 926913 /lib/x86_64-linux-gnu/ld-2.23.so
こんにちは 29190 hyb 0u CHR 136,20 0t0 23 /dev/pts/20
こんにちは 29190 hyb 1u CHR 136,20 0t0 23 /dev/pts/20
こんにちは 29190 hyb 2u CHR 136,20 0t0 23 /dev/pts/20

もちろん、別の方法もあります。それは、proc ファイル システムを使用して、まず hello プロセスのプロセス ID を見つけることです。

$ ps -ef | grep こんにちは
hyb 29190 27929 0 21:14 pts/20 00:00:00 ./hello 2
hyb 29296 28848 0 21:18 pts/22 00:00:00 grep --color=auto hello

プロセス ID が 29190 であることがわかります。プロセス ファイルの説明レコード ディレクトリを確認します。

$ ls -l /proc/29190/fd
lrwx------ 1 hyb hyb 64 3月2日 21:14 0 -> /dev/pts/20
lrwx------ 1 hyb hyb 64 3月2日 21:14 1 -> /dev/pts/20
lrwx------ 1 hyb hyb 64 3月2日 21:14 2 -> /dev/pts/20

このメソッドは、プロセスが実際に開いたものだけをリストするため、多くの情報をフィルタリングできます。ここでは、0、1、2、つまり標準入力、標準出力、標準エラーだけが開かれます。

ポートが占有されているかどうかを確認する

データベースを使用したり、Web サービスを有効にしたりすると、必ずポートの占有の問題が発生します。では、ポートが占有されているかどうかをどのように確認すればよいでしょうか?

lsof -i :6379 を実行します。
コマンド PID ユーザー FD タイプ デバイス サイズ/オフ ノード名
redis-ser 29389 hyb 6u IPv6 534612 0t0 TCP *:6379 (LISTEN)
redis-ser 29389 hyb 7u IPv4 534613 0t0 TCP *:6379 (LISTEN)

ここで、redis-ser プロセスがポート 6379 を占有していることがわかります。

すべてのTCP/UDP接続を表示

$ lsof -i tcp
ava 2534 hyb 6u IPv6 31275 0t0 TCP ローカルホスト:9614 (LISTEN)
java 2534 hyb 22u IPv6 96922 0t0 TCP localhost:9614->localhost:39004 (確立済み)
java 2534 hyb 23u IPv6 249588 0t0 TCP localhost:9614->localhost:45460 (確立済み)

もちろん、netstat コマンドを使用することもできます。

$ netstat -anp | grep 6379

ここでの -i パラメータの後に複数の条件を続けることができます。

  • -i 4 #ipv4 アドレス
  • -i 6 #ipv6 アドレス
  • -i tcp #tcp接続
  • -i :3306 #ポート
  • -i @ip #IPアドレス

したがって、特定の IP アドレスで確立された接続を表示する必要がある場合は、次の方法を使用できます。

ユーザーが開いたファイルを確認する

Linux はマルチユーザー オペレーティング システムです。他の一般ユーザーがどのファイルを開いているかを知るにはどうすればよいでしょうか? -uパラメータを使用することができます

$ lsof -u hyb
(内容が多すぎるため省略)

特定のプロセスまたは特定のユーザー以外が開いたすべてのファイルを一覧表示します

実際には、プロセス ID またはユーザー名の前に ^ が追加される点を除けば、前の使用方法と似ています。次に例を示します。

lsof -p ^1 #プロセス ID 1 のプロセス以外で開かれたすべてのファイルを一覧表示します lsof -u ^root #ルート ユーザー以外で開かれたすべてのファイルを一覧表示します

要約する

上記の紹介は 1 つの条件に基づいています。実際には、複数の条件を組み合わせることができます。たとえば、プロセス ID 1 のプロセスによって開かれた TCP ソケット ファイルを一覧表示するには、次のようにします。

lsof -p 1 -i tcp

lsof には多くのパラメータがあり、man コマンドを使用して特定のパラメータを表示できますが、私たちにとっては、これらの実用的な基本を知っていれば十分です。

さて、以上がこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただきありがとうございます。

この記事の著者: この記事のリンクを見る: https://www.yanbinghu.com/2019/03/05/61180.html
著作権に関する声明: この記事はオリジナル記事であり、著作権は Shouwang に帰属し、CC BY-NC-SA 3.0 ライセンス契約を採用しています。転載をご希望の場合はご連絡ください!

以下もご興味があるかもしれません:
  • Linuxでファイルの作成時間を表示する方法
  • Linuxでmore、less、catコマンドを使用してファイルの内容を表示します
  • Linux でファイル属性を表示する詳細な例 (ls、lsattr、file、stat)
  • Linux でフォルダのサイズを表示し、サイズ順に並べ替える方法
  • Linux でファイルシステムのブロックサイズとメモリページサイズを表示する簡単な方法
  • Linux du コマンドでフォルダのサイズを表示し、降順で並べ替える
  • Linuxファイルを表示するコマンドの詳細な説明

<<:  WeChat公式アカウントでReactプロジェクトを実行する方法

>>:  ゲーム着物メモ問題の簡単な分析

推薦する

HTMLヘッダータグの使用に関する詳細な説明

HTMLはヘッドとボディの2つの部分で構成されています** ヘッド内のタグはヘッドタグです** タイ...

div が隠しテキストを超え、div 部分の向こうの CSS コードを隠します

隠れる前に:隠れた後: CS: ...コードをコピーコードは次のとおりです。オーバーフロー:非表示;...

GobangゲームのWebバージョンを実装するためのJavaScript

この記事では、GobangゲームのWebバージョンを実装するためのJavaScriptの具体的なコー...

Mybatis ファジークエリ実装方法

Mybatis ファジークエリ実装方法mybatis のリバース アシスタントは非常に使いやすく、通...

SQL 結合クエリの内部結合、外部結合、クロス結合の違いの詳細な説明

データベースを使用するアプリケーションを開発する場合、必然的にユニオンクエリを使用する必要があります...

Vueモバイル端末は画面上で指をスライドさせる方向を判定する

vueモバイル端末は、画面上で指をスライドさせる方向を判断します。具体的な内容は次のとおりです。これ...

MySQL にテキストと画像を保存する方法

Oracle の大きなテキスト データ型 Clob 長いテキスト型 (MySQL ではサポートされて...

JS 日付コントロール My97DatePicker の基本的な使い方

My97DatePicker は非常に柔軟で使いやすい日付コントロールです。使い方はとても簡単です。...

HTMLファイルとは何ですか?HTMLファイルを開く方法

HTML は Hypertext Markup Language の略です。現在、ほとんどの Web...

MySQL サーバーにおける SSD パフォーマンスの問題の詳細な分析とテスト

【質問】 HP サーバーを使用しています。SSD が IOPS 約 5000 を書き込むと、%uti...

ウェブデザインにおけるテキスト入力ボックスのパラメータの説明

一般的なゲストブック、フォーラムなどでは、テキスト入力ボックスが使われています。これは HTML 言...

win10にmysql 8.0.18-winx64をインストールする詳細な手順

1. まず公式ウェブサイトにアクセスしてMySQLインストールパッケージをダウンロードします参考: ...

MySql におけるプロセス制御関数/統計関数/グループ化クエリの使用法の分析

これからの道のりは長く困難ですが、私は探求を続けます。また週末がやってきました。引き続き、皆さんと一...

TypeScript とは何ですか?

目次1. JavaScriptの問題2. TypeScriptの利点3. TypeScriptの欠点...

mysql 5.6.21 のインストールと設定の詳細な手順

1. 概要MySQL バージョン: 5.6.21ダウンロードアドレス: https://dev.my...