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プロジェクトを実行する方法

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

推薦する

メタタグのビューポートはデバイス画面のCSSを制御します

コードをコピーコードは次のとおりです。 <meta name="viewport&q...

MySQLのインストール時に発生する可能性のある問題

質問1:インストール中に net start mysql と入力すると、次のエラー メッセージが表示...

Web デザインでフラッシュ オーバーレイ ポップアップ レイヤーの z-index プロパティを設定しても機能しない

デフォルトでは、Flash は常にページのトップレベルに表示されます。つまり、ページに DHTML ...

値の転送を実現するために、2つの同じレベルのコンポーネントをVueで作成します。

Vue コンポーネントは接続されているため、コンポーネント間で値を渡す必要があるのは避けられません...

VMware Workstation のインストール Linux システム

始める段階から初心者になるまで、Linux オペレーティング システムは不可欠です。最初のステップは...

Vue ショッピングカートのケーススタディ

目次1. ショッピングカートの例2. コードの実装3. まとめ1. ショッピングカートの例一連の学習...

n 個のコンテナ要素による無限スクロールの実装コード

シナリオ最大 10000 要素のリストを正しくレンダリングする方法。無限ドロップダウン読み込みテクノ...

アイデアをDockerに接続してワンクリックでデプロイする方法

1. docker設定ファイルを変更し、ポート2375を開きます。 [root@s162 docke...

Docker イメージのインポートとエクスポートのコード例

Dockerイメージのインポートとエクスポートこの記事では、移行、バックアップ、アップグレードなどの...

Windows 10にWSL2 Ubuntu20.04をインストールしてdocker環境を構築する方法

WSLを有効にするシステムがWindows 10 2004以降であることを確認してください 「メニュ...

HTML フローティング フレーム (iframe 読み込み HTML) の設定と使用の例

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

Zookeeperスタンドアロン環境とクラスタ環境の構築

1. 単一マシン環境の構築# 1.1 ダウンロードZookeeper の対応するバージョンをダウンロ...

ブラウザの互換モードでボタン内のテキストが垂直方向に中央揃えにならない問題について簡単に説明します。

XML/HTML コードコンテンツをクリップボードにコピー<ボタンスタイル= "カ...

vue3 を使用してマテリアル ライブラリを構築する方法

目次なぜマテリアルライブラリが必要なのでしょうか?材質は何ですか?素材の種類fuep、vue3 ベー...

React仮想リストの実装

目次1. 背景2. バーチャルリストとは何か3. 関連概念の紹介4. 仮想リストの実装4.1 ドライ...