UNIXシステムで別のプロセスからファイル記述子を閉じる方法
-
11-07-2019 - |
質問
コマンド lsof を使用して、実行中のすべてのプロセスのファイル記述子を取得できますが、そのプロセス内にいなくてもこれらの記述子の一部を閉じたいです。これはWindowsで実行できるため、一部のアプリケーションのブロックを簡単に解除できます。
そのためのコマンドまたは機能はありますか?
解決
Windowsでは、実行中のカーネルにデバイスドライバーを挿入するプログラムを誰かが作成したため、プログラムを使用して実行できます。ちなみに、これは危険です。壊れたアプリケーションが使用していたハンドルを閉じた後、アプリケーションはハンドルが閉じられたことを知らず、アプリケーションが他の無関係なオブジェクトを開いたときもわからないからです。同じハンドルが他の無関係なオブジェクトを参照する可能性があります。壊れたアプリケーションをできるだけ早く強制終了する必要があります。
Linuxでは、確かに同じ種類の手法を使用できます。実行中のカーネルにモジュールを挿入するプログラムを作成します。モジュールと通信し、どのハンドルを閉じるかを伝えます。そうすることも同様に危険です。
他のヒント
なぜこれを行おうとしているのかわかりませんが、gdbを使用してプロセスにアタッチし、fdでclose()を呼び出すことができるはずです。例:
1つのシェル:cat
別のシェル:
$pidof cat
7213
$gdb -p 7213
...
lots of output
...
(gdb)
gdbにclose(0)を実行するように指示します:
(gdb) p close(0)
$1 = 0
(gdb) c
Continuing.
Program exited with code 01.
(gdb)
最初のシェルで次の出力を取得します:
cat: -: Bad file descriptor
cat: closing standard input: Bad file descriptor
そうは思わないが、lsofはファイルを開いたプロセスのPIDを提供するので、できることはプロセスを完全に強制終了するか、少なくともシグナルを送信して終了させることです。
疑わしい。ファイル記述子はプロセスローカルであり、 stdout
はすべてのプロセスに対して1ですが、もちろん一意のストリームを参照します。
おそらく、解決しようとしているブロッキングの問題について、より詳細な情報が役立つでしょう。
WindowsよりもUnixでこれを行う必要がはるかに少なくなります。
Windowsでは、ほとんどのプログラムは「ロック」する傾向があります。 (実際には共有を拒否します)開いているファイルは、他のプログラムによって読み取り/書き込み/削除できません。
Unixでは、ほとんどの場合これは起こりません。 Unixでのファイルロックは主に助言であり、通常の読み取り/書き込み/削除操作ではなく、他のロック試行のみをブロックします。プロセスの現在のディレクトリを削除することもできます。
Unixでの通常の使用で発生する唯一の状況については、ファイルシステムをアンマウントしようとする場合です(マウントされたファイルシステムへの参照はすべて、アンマウントをブロックできます)。