Linux の fuser ユーティリティは強力なツールです。名前が示すように、ファイル ユーザーまたはファイルまたはディレクトリを現在使用しているプロセスに関する情報を提供します。
しかし、定着器の機能は、プロセスに関する情報を提供するだけに限定されません。この記事では、fuser ユーティリティの使用方法を 5 つの実用的な例で説明しています。
1.ファイルまたはディレクトリを使用しているのは誰ですか?
これが fuser コマンドの基本的な使い方です。つまり、特定のファイルまたはディレクトリを使用しているプロセスを特定します。
$ fuser . ./: 3965c 4175c 4281c 4334c 4337c
上記の例では、現在のディレクトリ「./」を使用してすべてのプロセスを見つけるために、fuser ユーティリティを使用しました。
出力は、fuser を使用するプロセスのプロセス ID で構成されていますが、すべての PID の後に文字「c」が続きます。アクセスの種類を示します。アクセスのタイプは次のいずれかです:
- c 現在のディレクトリ
- e 実行中の実行
- f ファイルを開く。 f はデフォルトの表示モードでは省略されています
- F ファイルを書き込み用に開きます。 F はデフォルトの表示モードでは省略されています
- r ルート ディレクトリ
- m mmap ファイルまたは共有ライブラリ
したがって、出力の「c」は、これらのプロセスがこのディレクトリを現在のディレクトリとして使用していることを意味します。
オプション -v を使用して、出力に詳細情報を表示します。
$ fuser -v ./ USER PID ACCESS COMMAND ./: himanshu 3965 ..c.. bash himanshu 4175 ..c.. gedit himanshu 4281 ..c.. bash himanshu 4334 ..c.. socket_serv himanshu 4337 ..c.. bash
上記のように、現在のディレクトリで fuser を実行すると、このディレクトリを使用しているすべてのプロセスに関する情報が得られます。
2.実行可能ファイルのフューザー
socket_serv は、特定のポートをリッスンする TCP サーバーである C プログラムの実行可能ファイルです。
$ ./socket_serv
この実行可能ファイルで fuser を実行すると、次のように表示されます:
$ fuser -v socket_serv USER PID ACCESS COMMAND socket_serv: himanshu 4334 ...e. socket_serv
この例のアクセス指定子は「e」です。上記の例で見たアクセス指定子とは異なります。ファイルが実行可能であることを伝えます。
3. TCP/UDP ソケットを使用してプロセスをチェックする
fuser を使用すると、TCP/UDP ソケットを使用してプロセスを確認することもできます。上記の socket_serv サンプル C プログラムの実行可能ファイルは TCP ポート 5000 で実行されているため、このソケットで fuser ユーティリティを使用してみましょう。
$ fuser -v -n tcp 5000 USER PID ACCESS COMMAND 5000/tcp: himanshu 4334 F.... socket_serv
したがって、fuser が TCP ポート 5000 で実行されているプロセスのすべての詳細情報を提供することがわかります。
上記の例以外に、このユーティリティで「-m」フラグを使用して、USB ドライブなどのマウントされたファイル システムを使用するプロセスを表示できます。
4.特定のプログラムを使用しているプロセスを強制終了
これまで、fuser はファイル、ディレクトリ、ソケットなどを使用してプロセスに関する情報を提供することを学びました。しかし、このユーティリティの能力は、情報を提供することだけに限定されません。このユーティリティを使用してプロセスを強制終了することもできます。
バイナリ ファイル「socket_serv」にアクセスしているシステムで TCP サーバーが実行されていることがわかりました。それでは、fuser を使用して、このバイナリ ファイルを使用してプロセスを強制終了してみましょう。
$ fuser -v -k socket_serv USER PID ACCESS COMMAND socket_serv: himanshu 4334 ...e. socket_serv
「-k」フラグを使用して、ファイル「socket_serv」を使用してプロセスを強制終了したことに注意してください。サーバーが実行されていた別の端末を見てみましょう。
$ ./socket_serv Killed
4 つの異なる方法を使用してプロセスを強制終了する方法については既に説明しました。これで、プロセスを強制終了する方法がもう 1 つわかりました。
5. fuser を使用してインタラクティブにプロセスを強制終了
上記の例では、特定のファイルを使用してプロセスを強制終了したい場合にフラグ「-k」が使用されていますが、誤ってプロセスを強制終了することを避けるために、別のオプション「-i」が存在します。このオプションを使用すると、「fuser」はインタラクティブ モードで実行され、プロセスを強制終了する前に確認します。以下の例を参照してください。
$ fuser -v -k -i socket_serv USER PID ACCESS COMMAND socket_serv: himanshu 5643 ...e. socket_serv Kill process 5643 ? (y/N) y
したがって、「-k」と「-i」を使用すると、特定のファイルを使用するプロセスを選択的に強制終了できることがわかります。
さて、これは「fuser」コマンドの非常に強力な使い方です。
ファイルを強制的に削除したいが、それが多くのプロセスで使用されている場合、プロセスはファイルを削除できません。その場合、fuser ユーティリティを使用して、そのファイルを使用しているすべてのプロセス (または選択したプロセス) を強制終了できます。
$ fuser -v -k -i ./ USER PID ACCESS COMMAND ./: himanshu 3965 ..c.. bash himanshu 4175 ..c.. gedit himanshu 4281 ..c.. bash himanshu 4334 ..c.. socket_serv himanshu 4337 ..c.. bash Kill process 3965 ? (y/N) y Kill process 4175 ? (y/N) y Kill process 4281 ? (y/N) y Kill process 4334 ? (y/N) y Kill process 4337 ? (y/N) y
「-k」を使用すると、その特定のファイルを使用しているプロセスに SIGKILL シグナルが送信されることに注意してください。オプション -SIGNAL を使用して、他のシグナルを送信できます。 fuser がサポートするシグナルのリストは次のとおりです:
$ fuser -l HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS UNUSED
たとえば、次の例では、-k オプションを使用すると、SIGKILL ではなく SIGHUP が送信されます。
$ fuser -v -k -HUP -i ./