ファイルが開いているかどうかはどうすればわかりますか?

ファイルが開いているかどうかはどうすればわかりますか?

私のコードはディレクトリ内のファイルを繰り返し、システムの他のプロセスで現在開いている(書き込み用)ファイルのみを選択する必要があります。

理想的なソリューションはすべてのUnixで動作しますが、私はLinux用にのみ選択します。

プログラムはPythonで書かれていますが、必要に応じてカスタムC関数を追加できます。ここで使用できるAPIが何であるかを知る必要があります...

私が見つけた1つの提案は、Linuxですべてのファイル記述子を繰り返し、その/procリンクを解析して興味のあるファイルを指していることを確認することです。しかし、もっと重くなったようです...

たとえば、ファイルを開くと参照カウントが増加することがわかります。ファイルシステムは開いたファイルのブロックを解放しません。削除しても- 終了するまで - 機能によって異なりますtmpfile(3)

おそらく、ユーザープロセスはカーネルのこれらのレコードにアクセスできますか?

ベストアンサー1

Linuxでは/proc/<pid>/fd/<pid>これは、開いているファイルのリストをすばやく簡単に作成できることを意味します。今この瞬間どのコンテンツに接続しているかを確認してください。

思ったより「重い」というわけではありません。たとえば、私の古いAMD Phenom-II 1090T(現在約1000のプロセスを実行しています)では、以下のbash while / readループを実行するのに約1.5秒しかかかりません。

Bashでは、次を使用して連想配列を作成できます。

declare -A openfiles

while IFS=$'\n' read l; do
  openfiles[$l]=1
done < <(find /proc/*/fd/ -type l -printf '%l\0' |
           grep -zvE '^(socket|pipe|anon_inode):' | sort -zu)

(単純な例であり、まったく最適化されていません。最適化することはまったく難しくありません)

次に、ファイルが開いていることを確認します。

if [ "${openfiles[full-path-to-file]}" == 1 ] ; then .... ; fi

Pythonでは辞書を使用しos.walk()て作成できます。os.readlink()または使用プロセスプロセスファイルシステムまたはプスチル基準寸法。

psutilクロスプラットフォームであり、open_files()ここに便利な方法があります。

注:を使用してこれを実行できますが、非常に遅い速度lsofですlsof。これは仕事に必要なものよりはるかに多くのことをします。

おすすめ記事