プログラムがアクセスするファイルのリスト

プログラムがアクセスするファイルのリスト

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    

関連情報