...

lsofを効果的に活用する:開いているファイルとプロセスを分析する

をセットした。 lsof linux を入力すると、どのプロセスがどのファイル、ソケット、またはポートを開いたままにしているかを数秒で確認できます。これにより、ブロックされているログや使用中の 港湾 また、アクセス制限のかかったファイルにも直接アクセスし、問題を的確に解決します。.

中心点

スムーズに始められるよう、最も重要な点をまとめます。 側面 簡単にまとめると。.

  • リソース 可視化する:プロセス、ファイル、ディレクトリ、デバイス、パイプ、ソケット。.
  • フィルター 使用方法:プロセス名 (-c)、PID (-p)、ユーザー (-u)、ファイル、ディレクトリ (+d/+D)、ポート (-i) による検索。.
  • エラー 絞り込み:アクセス制限のかかったファイルの特定、ポートの競合の解消、応答停止したサービスの特定。.
  • ネットワーク 確認:アクティブな接続と使用中のポートを素早く特定する。.
  • ワークフロー 効率化:まず範囲を絞り込み、次に的を絞って確認し、その後行動に移す。.

なぜ「lsof」が日常生活で重要なのか

私はこうしている。 lsof, 、サービスが起動しない場合、ファイルが「busy」と表示される場合、またはポートがすでに使用中の場合。このツールは、ファイル、プロセス、ユーザー、ネットワークを明確な形で結びつけます。 表示. どのPIDがアクセスを保持しているか、またそれがいつから続いているかを即座に把握できます。これにより、当て推量で対応するのではなく、誤って間違ったサービスを停止してしまうことなく、正しいプロセスを終了させることができます。 特に本番サーバーでは、原因をプロセスに直接特定できるため、数分から数時間もの時間を節約できます。このアプローチにより、サポートチケットの数を減らし、ダウンタイムを低減し、信頼性の高い 調査結果.

基本的な構文と出力の仕組みを理解する

基本形は次の通りです lsof [オプション] パラメータを指定せずに、現在開いているすべての オブジェクト. 負荷の高いシステムでは、何千行もの出力を一通り確認する代わりに、出力をフィルタリングしています。重要なのは、Linuxにおける「ファイル」の定義が広範であるという点です。これには、ディレクトリ、デバイス、ライブラリ、ネットワークなどが含まれます。ソケット. 。出力では、COMMAND、PID、USER、FD、TYPE、NAME といった列が役立ちます。 私はまず、FD(ファイルディスクリプタ)、TYPE(REG、DIR、IPv4/6)、およびパスやポート情報が記載されたNAMEに注目します。これらの列を確認すれば、現在のシステム状態を短時間で把握し、リソースを適切に割り当てることができます。 プロセス.

実践におけるインストールと権限設定

多くのディストリビューションでは、 lsof プリインストールされていません。そのため、パッケージマネージャーを使って早めにインストールします(apt install lsof, dnf install lsof, yum install lsof 或いは pacman -S lsof)、インシデント発生時にすぐに利用できるようにするためです。全体像を把握するために、私は通常、 スド 権限を上げていないと、多くのエントリが「permission denied」と表示されたり、そもそも存在しなかったりするためです。 それでも、まずは意図的にroot権限なしで開始し、どこまで進められるかを確認した上で、必要な場合にのみ権限を引き上げます。SELinuxやAppArmorが導入されているシステムでは、セキュリティコンテキストによって表示範囲が制限される可能性がある点に注意しています。ビルドによっては、 lsof コンテキストを追加します。一括クエリでは、次のようにして警告を抑制します。 -w, 、スクリプトの堅牢性を維持するためです。.

FDフィールドと型を安全に読み取る

「コラム」 FD これが私の理解の鍵です。よく見られる値としては、次のようなものがあります:

  • cwd: プロセスの現在の作業ディレクトリ。.
  • txt: プロセスの実行ファイル(テキストセグメント)。.
  • mem: 読み込まれた共有ライブラリとメモリマッピングされたファイル。.
  • 0u,1w,2w: モード付き標準記述子(stdin、stdout、stderr) r (読む), w (write) または u (読み取り/書き込み)。.
  • 次のようなより高い数値、例えば 3u, 7r: 通常のオープン記述子。多くの場合、ファイル、ソケット、またはパイプである。.

出典: TYPE オブジェクトクラスを読み込むと: REG (通常のファイル)、, DIR (ディレクトリ)、, CHR/BLK (描画/ブロック装置)、, FIFO (パイプ)、, IPv4/IPv6 (ネットワーク)、, UNIX (Unixドメインソケット)。In 名前 パス、またはソケットの場合はエンドポイントが指定されます。例:. TCP *:80 (LISTEN) 或いは UDP 127.0.0.1:123. もし私が (削除済み) 最終的に確認すると、ファイルが削除されたにもかかわらず、まだPIDによって保持されていることがわかります。これは、ディスク容量が「消えてしまう」典型的な原因です。.

対象を絞ってフィルタリング:ファイル、ディレクトリ、ポート

まず文脈を絞り込み、それからそれにふさわしい フィルター. ディレクトリには、私は lsof +D /var/log (再帰的に)または lsof +d /var/log (フォルダ自体のみ)。個々のファイルについては、例えば次のように直接確認します。 lsof /var/log/syslog, 、書き込み中のプロセスを確認するためです。ポートについては、次のように設定しています lsof -i:80, lsof -i:443 あるいは一般的な lsof -i 。私はこれをよく次のように組み合わせています。 -nP, 、これによりlsofはIPアドレスやポートの解決を行わず、処理速度が向上します。こうして、複雑で把握しづらいシステムの状態が、瞬く間に焦点の絞られた 写真.

フィルターを組み合わせて絞り込む

再現性のある分析を行うために、フィルターと -a 論理的に結合されます。これにより、すべての条件を満たすエントリのみを取得できます。例:

  • lsof -a -p 1234 -d cwd,txt,mem – あるプロセスの作業ディレクトリ、バイナリファイル、および読み込まれたライブラリのみ。.
  • lsof -a -iTCP -sTCP:ESTABLISHED -p 1234 – 特定のPIDの確立済みのTCP接続のみ。.
  • lsof -a -u www-data +d /var/www – /var/www 配下にあり、ユーザー www-data のプロセスを起動したままにしているファイル。.

と一緒に -d 記述子(数字や「」のような名前)でフィルタリングします cwd, mem). -U ローカルIPCの問題を調査したい場合、Unixドメインソケットの情報を的を絞って出力してくれます。これにより、不要な情報を排除し、問題に関連する情報だけを正確に把握することができます。.

プロセスとユーザーを素早く関連付ける

サービス名を知っている場合、 lsof -c nginx Webサーバーの開いているすべてのファイルを含め、 ライブラリ, 、設定、およびソケット。正確な分析を行うため、私はよくPIDを利用しています: lsof -p 1234 特定のプロセスのすべてのハンドルを表示します。ユーザー関連のチェックは、次のように行います。 lsof -u mysql または別のアカウントを使用して、サービスアカウントが開いているリソースを表示します。より詳細な分析を行う際には、プロセスビューに以下を追加します。 プロセス会計 そして、プログラムがリソースをどのくらいの頻度で、どのくらいの時間使用しているかを確認します。プロセス、ユーザー、アクティビティの各視点からのこの組み合わせにより、厄介な現象に直面した際にも、迅速に 原因.

特殊なケース:削除されたファイル、logrotate、およびディスク容量を大量に消費するファイル

ディスク容量が「不足」している場合、私はたいてい次の方法で原因を突き止めます。 lsof +L1: これは、すでに削除されているものの、プロセスによってまだ参照されているファイルを一覧表示します。典型的な例としては、ローテーションされたログ、大容量の一時ファイル、デバッグダンプなどが挙げられます。 慌ててパーティションを拡張する代わりに、表示されたPIDを個別に終了させるか、リロード用の標準的なシグナルを送信します。ログサービスについては、ディスクリプタが再オープンされるよう、そのサービス自体を適切にリロードすることを優先しています。次のような応急措置は truncate あるいは、プロセスを再起動せずに直接削除しても、問題は先送りされるだけである。.

長いデータストリームの場合、私はさらにその列を確認します SIZE/OFF (ビルドによっては表示される)を使用して、プロセスが非常に大きなオフセットに紐づいているかどうかを確認します。これにより、ファイルが削除済みとしてマークされているにもかかわらず、ハンドルがこれほど多くのメモリを占有している理由が説明できます。.

典型的なエラーシナリオを体系的に解決する

ロックされているファイルは、以下の後に削除します lsof その処理を担当するプロセスを教えてくれました。やみくもにサービスを停止するのではなく、対象のPIDを特定して終了させたり、その特定のサービスを再起動したりします。ポートの競合は、 lsof -i:, バインドされているPIDを確認し、それに応じてポート、サービス、またはファイアウォールを調整します。プロセスがハングした場合は、 lsof -p そして、それがファイル、パイプ、あるいはソケットを待機しているかどうかを判別します。詳細な分析を行うために、このビューに以下を追加します。 straceを的を絞って実行する, 、システム呼び出しをリアルタイムで監視するためです。これにより、繰り返し発生する不具合を確実に解決し、将来に備えて解決手順を記録しています。 事件.

コンテナとネームスペースを考慮する

コンテナ化された環境(例:独自のネットワークネームスペースを使用する場合)について解説 lsof ホストとコンテナ間の不一致に気づきました。私は、コンテナ内で直接 lsof を実行するか、ホスト側から対象プロセスのネームスペースに入ります。そうすることで、コンテナ内のポートが LISTEN 状態であるにもかかわらず、ホスト上では「空き」状態に見える理由がわかります。これらは異なるネームスペースにあるからです。 マウントネームスペースについても同様の方法で確認しています。バインドマウントやオーバーレイファイルシステムは、NAME列に実際のパスとともに表示されるため、誤って設定されたボリュームを見つけるのに役立ちます。 また、スーパーバイザーやオーケストレーションソリューションを介してサービスを制御している場合は、ユーザーおよびCgroupごとにオープンなディスクリプタを分類しています。.

lsof -i によるネットワーク分析

と一緒に lsof -i アクティブな接続を検出し、使用中の接続を監視します 港湾. フィルターとして lsof -iTCP -sTCP:LISTEN LISTEN状態にあるサービスを対象にリストアップします。個々のプロトコルについては、以下のように処理しています。 lsof -iUDP あるいは、次のような特定のポートなど lsof -i:25 メールサーバー向け。また、あるPIDが複数のソケットを開いたままにしていないかを確認します。これは、メモリリークや無限ループの兆候となる可能性があります。セキュリティチェックでは、想定されるサービスと出力結果を照合し、不審なものや忘れられたものを検出します。 サービス内容. このネットワークビューなら、複数のツールを並行して確認する必要がなく、すべてを一か所で把握できるため、時間を節約できます。.

ネットワークの詳細についてさらに掘り下げる

特に的を絞ったクエリを行う際には、以下のアドレスおよびポートの構文を使用しています。 -i: 送信元または宛先のアドレスに絞り込みます(lsof [email protected]) または、アドレスとポートを組み合わせる(lsof [email protected]:443).と -sTCP:ESTABLISHED 生産的なセッションが見られる一方で、 -sTCP:LISTEN リスナーのみを出力します。UDP分析は、短命なソケットを多数持つサービス(DNS、Syslog、NTPなど)を可視化するために活用しています。また、プロセスがネットワーク上で必要以上に露出していないかどうかも確認しています(例: 0.0.0.0 (ローカルインターフェースの代わりに)。これにより、後のハードニング作業の負担が軽減される。.

表の概要:よく使われるオプション

私はいくつかの主要なオプションを非常に頻繁に利用しており、状況に応じてそれらを拡張しています。 シナリオ. 以下の表には、主要なスイッチを簡潔な説明と例とともにまとめています。これにより、適切な形式を素早く見つけられ、長々としたヘルプの表示を省くことができます。私はこれらのオプションをモジュール式に活用することで、柔軟性を保っています。この基本をマスターすれば、多くの課題をたった一つの 呼びかけ.

オプション 目的
-i ネットワーク接続と使用中のポートを表示する lsof -i:443
-c 名前 プロセス名でフィルタリング(プレフィックス一致) lsof -c nginx
-p PID あるPIDに関連するすべての開いているファイル lsof -p 1234
-u ユーザー ユーザーの未割り当てリソース lsof -u mysql
+d DIR 指定されたディレクトリのみ lsof +d /var/log
+D DIR ディレクトリを再帰的に探索する lsof +D /var/log
-nP DNSおよびポート名の検索を行わない(高速) lsof -nP -i
-t PIDのみを出力する(スクリプト対応) lsof -t -i:80
+L1 削除されたが、まだ開いているファイルを表示する lsof +L1

私はこうしている。 -t スクリプト内でPIDを直接渡すために頻繁に使用され、例えば kill 或いは systemctl.と一緒に +L1 削除されたファイルを未処理の状態のままにしておき、それによってストレージ容量を占有しているプロセスを検出します。これと組み合わせて -r (繰り返す)と、短期間のうちに変化が見られる 間隔. 段階的に検査を行うことで、誤った解釈を避け、一貫性のある作業が可能になります。そうすることで、診断結果は再現性があり、測定可能となります クリア.

出力データを効率的に処理する

結果をより早く得られるように、出力データをそのままさらに整形しています 使用.と一緒に lsof -t -i:80 | xargs -r kill -TERM ポート80を使用しているプロセスをすべて終了させます。レポートについては、 lsof -nP -i | grep LISTEN 戻って、特定の状態を絞り込みます。また、 アック 役立つ: lsof -nP | awk '{print $1,$2,$3,$9}' 名前、PID、ユーザー、パスといった表示項目を絞り込みます。正常に動作するワンライナーを記録しておけば、後で手間が省けます。 検索 適切なパターンに従って。次のような小さな道具など 'lsof -nP -i:443' を実行する' 変化をリアルタイムで示し、意思決定を迅速化します。.

自動化と解析可能な出力

定期的な検査には、機械可読形式の lsof をもって -F. 必要なフィールド(例:プロセス、コマンド、ユーザー、FD、名前)のみを選択し、それらを安定して解析し続けます。例:

  • lsof -Fn -Fp -Fc -Fu -t -i:443 – PIDまたは名前のみを必要とするスクリプト向けの、最小限のフィールド。.
  • lsof -Fpcun -a -iTCP -sTCP:LISTEN – リスナーを把握し、的を絞って分析する。.

と一緒に -r 2 2秒ごとに「ライブ」ビューを生成し、スナップショットを比較しています。パイプラインでは、変更を統合しています(sort, uniq, 差分)、新規または消失するハンドルを検出するためです。高負荷時でもクエリがハングアップせず、モニタリングジョブが正常に終了するよう、意図的にタイムアウトを設定しています。.

ベストプラクティスとセキュリティ上の考慮事項

最小限の権限で分析を開始し、必要な場合にのみ権限を引き上げます 根元, 、権限が不足している場合は。そうすることでリスクを軽減し、ログを整理整頓しています。定期的にスキャンを実行して確認しています。 lsof -i 私が想定していたサービスとは異なり、異常なリスナーや接続を検知するためです。その後、不審なPIDについては、ファイルやライブラリなどを対象に、的を絞って調査を行います。 ソケット. メンテナンス期間中は、削除済みだがまだ開かれているファイルがディスク容量を無駄にしないよう対策を講じます。セキュリティを重視する方は、lsofをチェックリストに組み込み、異常が発生した際には定められた手順に従って対応します。 ステップ.

よくある落とし穴と適切な解決策

  • すべてのエントリが表示されていない: root権限がないと、他のユーザーのプロセスやカーネル関連のハンドルが不足することがよくあります。私は意図的に スド.
  • 低速出力: 以下のコマンドで解決を無効にします -nP, 再帰は避け、 -a 激しく。.
  • +D 高すぎる: 再帰的なディレクトリ探索は、非常に大規模になることがあります。まず、次のように始めます。 +d あるいは具体的な手順を定め、必要に応じて後から拡張するようにします。.
  • ポートが占有されており、処理状況が不明: コンバイン lsof -i: -nP をもって -t PIDについては、以下に進んでください lsof -p もっと深く。.
  • „「空き」スペースが不足している: lsof +L1 開かれているが削除済みのファイルを見つけます。その後、対象のプロセスを再起動または終了させてください。.
  • コンテナ/ネームスペース: クエリは適切なネームスペースで確認するようにしています。そうしないと、誤ったリスナーが表示されたり、開いたままのファイルを見落としたりしてしまうからです。.

パフォーマンスと限界を理解する

非常に大規模なシステムでは、lsofによる完全なスナップショットの取得には時間がかかり、顕著な 負荷. そこで、早い段階でフィルタを適用し、 -nP すべての解を検証します。ハンドルの数が膨大な場合は、並行して ファイル記述子の制限 必要に応じてそれを持ち上げてください。スクリプトではタイムアウトを考慮に入れ、 -t データ量を最小限に抑えるため、PIDのみを渡すようにしています。例外については記録し、繰り返し行われるチェックを自動化プロセスに組み込んでいます。これにより、負荷がかかっている状況下でも、診断は信頼性が高く明確なまま維持されます。 可変.

実践ワークフロー:症状から原因へ

まず、次の質問から始めたいと思います。これはファイル、プロセス、それとも ポート? その後、適切な導入文を選びます。例えば、 lsof /ファイルへのパス/, lsof -p 或いは lsof -i:. USER、FD、TYPE、NAMEを確認し、予想通りと思われる点と意外な点を記録します。その後、対応を行います:プロセスの再起動、設定の調整、制限の解除、またはポートの開放などです。 不確実な場合は、その状態を固定し、ログを保存した上で、変更後に測定を繰り返し行います。この手順により、集中力を維持でき、明確な結果が得られます。 証拠の連鎖.

チェックリスト:毎日の食事にぴったりの手早く作れるレシピ

  • 誰がそのファイルをロックしているのですか? lsof /ファイルへのパス/ – PIDを確認し、対象のプロセスを再起動または終了させる。.
  • どのサービスがポートを占有していますか? lsof -nP -i: – 競合を解消し、ポートまたはバインドアドレスを調整する。.
  • レコード盤の置き場所はどこへ消えてしまうのか? lsof +L1 – 開いているファイルや削除されたファイルを見つけ、関連するPIDを再起動する。.
  • プロセスはI/Oで停止していますか? lsof -p – パイプ、ソケット、またはファイルに注意を払い、必要に応じてstraceを追加する。.
  • 実際に再生されているリスナーはどれか? lsof -nP -iTCP -sTCP:LISTEN – 期待リストと照合する。.
  • サービスアカウントはどのようなリソースを使用しますか? lsof -u – アカウントごとの異常を検知する。.

日常生活のための要約

lsof どのユーザーがどのファイル、どのディレクトリ、あるいはどのポートをブロックしているかを表示します。 -c, -p, -u, +d/+D そして -i すぐに視野を絞り込みます。ロックされたファイルのロックを解除し、ポートの競合を見つけ出し、異常な コネクション. と組み合わせて -nP 私は迅速に作業を進め、出力結果を管理しやすい範囲に抑えています。より詳細な分析を行う際には、ツールを追加したり、正常に動作するワンライナーをドキュメント化したり、繰り返し行われるチェックを自動化に組み込んだりしています。これにより、lsof を用いた診断は、直接的で確実かつ測定可能なものとなります。 効果的に.

現在の記事