
time
特定の命令が消費するCPU時間を計算する場合は、これは優れた命令です。
私は、プログラムとそのサブルーチンがアクセスするファイルを一覧表示できるようなものを探しています。リアルタイムまたはポストレポート。
現在私は以下を使用しています:
#!/bin/bash
strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'
ただし、実行したいコマンドが次に関連する場合はsudo
それほどスマートではありません(既存のファイルまたは権限の問題があるファイルのみを一覧表示したり、読み取ったファイルと書き込んだファイルにグループ化したりできます)。そしてstrace
かなり遅いので、より速いオプションがあれば良いようです。
答え1
私はあきらめて自分のツールを書いた。その文書を引用すると、次のようになります。
SYNOPSIS
tracefile [-adefnu] command
tracefile [-adefnu] -p pid
OPTIONS
-a List all files
-d List only dirs
-e List only existing files
-f List only files
-n List only non-existing files
-p pid Trace process id
-u List only files once
ファイルを出力するだけなので処理する必要はありませんstrace
。
https://codeberg.org/tange/tangetools/src/branch/master/tracefile
答え2
トレースシステムコールを使用できますが、strace
速度の低下は避けられません。strace
高い権限でコマンドを実行する場合は、rootとして実行する必要があります。
sudo strace -f -o foo.trace su user -c 'mycommand'
潜在的に高速なもう1つのアプローチは、ファイルシステムアクセス機能を含むライブラリをプリロードすることです。環境LD_PRELOAD=/path/to/libmywrapper.so mycommand
変数LD_PRELOAD
は、高い権限で呼び出されるプログラムには渡されません。このラッパーライブラリのコードを書く必要があります(これは「楽しさと利益のためのライブラリインサータの構築」の例です。); Webに再利用可能なコードがあるかどうかわかりません。
特定のディレクトリ階層のファイルを監視する場合は、次のようにファイルシステムビューを作成できます。ロギングファイルシステムこれにより、ビューを介したすべてのアクセスが記録されます。
loggedfs -c my-loggedfs.xml /logged-view
mycommand /logged-view/somedir
LoggedFSを構成するには、プログラムに含まれているサンプル構成から始めて読んでください。LoggedFS 構成ファイルの構文。
もう一つの可能性はLinuxです監査サブシステム。デーモンが起動したことを確認し、auditd
記録する内容を設定します。auditctl
。記録されたすべてのジョブは記録されます/var/log/audit/audit.log
(通常のディストリビューションで)。特定のファイルの視聴を開始するには:
auditctl -a exit,always -w /path/to/file
ディレクトリを監視すると、そのディレクトリとそのサブディレクトリのファイルも繰り返し監視されます。監査ログを含むディレクトリを表示しないように注意してください。特定のプロセスにロギングを制限できます。auditctl
利用可能なフィルタのマニュアルページを参照してください。監査システムを使用するには、ルートである必要があります。
答え3
私はあなたがlsofをしたいと思います(おそらくプログラムとそのサブアイテムについてgrepにつながるでしょう)。現在アクセス中のファイルシステム上のすべてのファイルを通知します。プロセスがアクセスするファイルに関する情報(ここから):
lsof -n -p `pidof your_app`
答え4
おそらく十分な制御を提供していませんが(まだ?)、私はLinuxカーネルのfanotifyとunshareを使用して、特定のプロセスとそのサブプロセスによって生成されたプロセスのみを監視するなど、必要な作業を少なくとも部分的に実行するプログラムを作成しました。変更された(または読み取られた)ファイル。 strace(;
以下で見つけることができます: https://github.com/tycho-kirchner/shournal
シェルの例:
$ shournal -e sh -c 'echo hi > foo1; echo hi2 > foo2'
$ shournal -q --history 1
# ...
Written file(s):
/tmp/foo1 (3 bytes) Hash: 15349503233279147316
/tmp/foo2 (4 bytes) Hash: 2770363686119514911