SERVER:~ # df -mP /home/
Filesystem 1048576-blocks Used Available Capacity Mounted on
/dev/mapper/rootvg-home_lv 496 491 0 100% /home
SERVER:~ #
SERVER:/home # lsof | grep -i deleted | grep -i "home" | grep home
badprocess 4315 root 135u REG 253,2 133525523 61982 /home/username/tr5J6fRJ (deleted)
badprocess2 44654 root 133u REG 253,2 144352676 61983 /home/username/rr2sxv4L (deleted)
...
SERVER:/home #
ファイルはまだ使用中に削除されました。したがって、それらはまだスペースを消費します。しかし、「badprocess *」を再起動したくありません。 OSはSLES9ですが、「一般的に」これを求めています。
質問:これらのすでに削除されたファイルを保持しているプロセスを再起動せずに削除して、スペースを解放するにはどうすればよいですか?
/proc
のエントリを使用して、このようなファイルを切り捨てることができます。
# ls -l /proc/4315/fd
これにより、プロセス4315によって開かれたすべてのファイルが表示されます。すでにlsof
を使用しており、削除されたファイルがファイル記述子135であることを示しているため、次のように、削除されたファイルが使用していたスペースを解放できます。
# > /proc/4315/fd/135
プロセス44654によって開かれた他の削除されたファイルについても同じことが言え、ファイル記述子133があるので、次のようになります。
# > /proc/44654/fd/133
これで、スペースが解放されたことがわかります。
これを使用して、削除されたがプロセスによって開いたままになっているファイルの内容をコピーすることもできます。cp /proc/XXX/fd/YY /some/other/place/filename
だけです。
デバッガーまたはptrace()
機能を使用してプロセスを操作し、そのファイルの一部を閉じるようにする何かを使用してbadprocess
に接続する以外に、私は方法がないと思いますそれを行う。
タイトルはロックについて説明していますが、質問の本文でロックについては言及していません。とにかく、プロセスがファイルに対して持っているロックを強制的に放棄する方法もありません。これは、ファイルがファイルシステムにリンクされているかどうかに関係なく当てはまります。