/proc ファイルシステムの読み取り専用部分を複製する方法

/proc ファイルシステムの読み取り専用部分を複製する方法

/proc ファイルシステムを読み取る際の問題は、それが原子的ではないということです。私はそれを読むことが期待されるライブラリ(Pythonのprocfs)を使ってみましたが、私が探していたプロセスがもう消えたので、約5%の時間失敗しました。したがって、/ procのすべての内容を別の場所にコピーしたいと思います/proc_clone/<GUID>/。たとえば、このコマンドを使用してGUIDを生成できますuuidgen

素朴なアプローチは試してみるcp -rことですが、「許可拒否」エラーがたくさん発生し、1秒以上かかります。サブセットだけが必要で/proc/<pid>、そのような場合でも文字列に変換できる読み取り専用コンテンツのみが必要です(最終的にこれらすべてを含むJSONファイルを作成したい)。

私はこれを行うことができ、短くてシンプルで非常に高速なスクリプトを探しています。すぐに終了するプロセスは、プロセスをスキップして処理できます。しかし、私はCコードを書くのを避けたいと思います。むしろbash、既存のユーティリティ、おそらくPerl / Pythonを使用したいと思います。ここでの目標は、/procJSONファイル自体を作成するのではなく、サブセットのスナップショットを作成することです。

私は「絶対にコピーしようとしないで/proc読んでください」という感情を聞きました。まあ、その非原子的な性質は、非常に簡単なことをしようとするときに多くのtry/catchコードを捨てなければならないことを意味します。 Python(最終的に使用したい)などの高度な言語を使用して繰り返すことは、/procIOおよびCPU時間に関連する遅いアプローチです。これにより、プロセスが中断されるリスクが高まります。 (私はいつもそれを見ます。毎分/ procをクエリするスクリプトがあり、多くの例外が発生します。)人間が読める形式でプロセスのCPUとメモリ使用量情報を含む単一のJSONファイルを出力するライブラリを構築します。したいのです(例:jiffiesではなく秒、ページではなくバイト、値に加えて単位を使用する.. I'ディレクトリダンプからファイルを作成するのにかかる時間は心配しません。してはいけない場合は、どのような方法を使うべきですか?

ベストアンサー1

あなたは見る必要がありますproc マニュアルページ。項目を見て、目的の/proc/[pid]/* ファイルを選択します。

あなたはそうですいいえすべてをコピーしたいです。たとえば、共有メモリなど、プロセス内のすべての仮想メモリがあります /proc/[pid]/mem。つまり、すべてのメモリのサイズです。また、プロセスがそれを所有している場合、またはmemよりptraced高い読み取り権限を持っていない限り、読み取ることはできません。 (その後ただ仮想サイズ - /proc/pid/status -> VmSize) - など

あるいは、他のファイル、パイプなどのファイル記述子を保持する実行可能/proc/PID/exeファイルへのリンクだけです。/proc/PID/fd/*stdinstdoutstderr

他にもたくさんあります特別なファイルと多数のリンク(すべて集中すると決して完了できません)。上記の人について読んでください。kernel.orgのドキュメント、等。


また、これらのファイルはブロックデバイスファイルではありません。 proc はメモリベースのファイルシステムなので、メモリに常駐します。ある意味では、簡単にアクセスできるようにカーネルウィンドウと呼ぶことができます。

したがって、これは所望の読み取りにおいても大きな利点になります。情報がメモリに常駐しているため、ディスクI / Oがないため、非常に高速です。もちろん、データをディスクに書き込むことを選択すると、データが失われます。しかし、それでもディスクからディスクに書き込むよりもはるかに高速です。


共有メモリだと思い、必要以上に複製しないようにしてください。作業のために /proc.Viewpsなどtopのソースコードを見て、free他のツールの仕組みをすばやく理解することもできます。


私はある程度特定の側面を扱うことができる別の答えを書きました。次のいずれかが役に立ちます。


編集する:

コメントは。次のことができます。

save_to=/some/path

pushd /proc
for d in [0-9]*; do
    cp "$d/cmdline" "$save_to/$d.cmdline"
    cp "$d/status" "$save_to/$d.status"
done
popd

しかし、上記のアプローチは、人々のニーズに十分に速くない可能性が高いため、Cなどの低レベルを使用してファイルを解析します。

毎時間複製する場合はそうです。ただし、数秒または数分間隔で複製されません。

おすすめ記事