どのプログラムやスクリプトが特定のファイルを生成したかを調べることは可能ですか?

どのプログラムやスクリプトが特定のファイルを生成したかを調べることは可能ですか?

「client_state.xml」、「lockfile」、「time_stats_log」という3つのファイルが私のホームディレクトリに突然現れました。最後の2つは空です。彼らがどのようにそこまで来たのか疑問に思います。これが最初に発生したわけではありませんが、最後にファイルを破損や不満なしに削除したのは数週間前でした。私が何をしていたのか覚えていませんstat $filename。彼らがどこから来たのかを調べる方法はありますか?

または、デフォルトディレクトリ(サブディレクトリを除く)でファイルの生成を監視する方法はありますか?

答え1

ファイルシステムにアクセスして、ファイルシステムで何が起こっているのかを観察できます。ロギングファイルシステム。これはスタックファイルシステムディレクトリツリーにすべてのアクセスを記録します。

loggedfs -l /var/tmp/$USER-home-fs.log ~

ただし、ホームディレクトリ全体を記録すると、システムが遅くなる可能性があります。あなたは少なくとも1つを書きたいと思うでしょう構成ファイルそして厳格なフィルタリングを経ます。

root アクセス権がある場合は、Linux で次のものを使用できます。監査サブシステムファイルシステムへのアクセスを含む多くのコンテンツを記録します。デーモンが起動したことを確認し、auditd記録する内容を設定します。auditctl。記録されたすべてのジョブは記録されます/var/log/audit/audit.log(通常のディストリビューションで)。特定のファイルの視聴を開始するには:

auditctl -w /path/to/file

または長い形式

auditctl -a exit,always -F path=/path/to/file

-wまたはを使用してディレクトリを監視すると、-F dir=そのディレクトリとそのサブディレクトリのファイルも再帰的に監視されます。

答え2

判断する方法がないと思います。どのプログラムが作成されましたか1つの文書。

代替質問:あなたできるしかしinotify。を使用すると、サブinotifywaitシステムのコマンドラインインターフェイスにホームディレクトリ内のイベントを見つけるようにinotify指示できます。create

$ (sleep 5; touch ~/making-a-test-file) &
[1] 22526

$ inotifywait -e create ~/
Setting up watches.
Watches established.
/home/mmrozek/ CREATE making-a-test-file

-m最初のイベントを見た後に終了しないように指示する(モニター)を使用して実行したい場合があります。

答え3

私はこれが古い質問であることを知っていますが、誰かが役に立つと思う場合に備えて別のアプローチを提案します。もともとはだまされた質問への答えでこの記事を投稿しました。

sysdig1つのオプションは、オープンソースシステム監視アプリケーションを使用することです。これにより、ファイルアクティビティを名前で監視できます。どのプロセスが次の名前のファイルを生成するかを確認したいとします/tmp/example.txt

# sysdig fd.name=/tmp/example.txt
567335 16:18:39.654437223 0 touch (5470) < openat fd=3(<f>/tmp/example.txt) dirfd=-100(AT_FDCWD) name=/tmp/example.txt flags=70(O_NONBLOCK|O_CREAT|O_WRONLY) mode=0666
567336 16:18:39.654438248 0 touch (5470) > dup fd=3(<f>/tmp/example.txt)
567337 16:18:39.654438592 0 touch (5470) < dup res=0(<f>/tmp/example.txt)
567338 16:18:39.654439629 0 touch (5470) > close fd=3(<f>/tmp/example.txt)
567339 16:18:39.654439764 0 touch (5470) < close res=0
567342 16:18:39.654441958 0 touch (5470) > close fd=0(<f>/tmp/example.txt)
567343 16:18:39.654442111 0 touch (5470) < close res=0

この出力では、pid 5470というプロセスでtouchファイルが開いていることがわかります。

より多くの情報が必要な場合は、システムコールトレースを収集する「キャプチャモード」で実行できます。

# sysdig -w /tmp/dumpfile.scap

次に、ファイルが生成されるのを待ってから停止してsysdig実行します。

# csysdig -r /tmp/dumpfile.scap

これにより、何が起こっているのかを調べることができます。を押して<F2>選択し、ファイル名の検索をFilesクリック<F4>してから<F6>「dig」をクリックします(上記のコマンドに似た出力が表示されます)。これにより、同じ方法を使用して実際にファイルを生成したプロセスに関する情報を見つけることができます。

必要に応じてというGUIバージョンがありますcsysdigsysdig-inspect

答え4

まだそのようなものがないので、inotifyファイルを繰り返すスクリプトを書くことができます。

#!/bin/sh

while [ true ]; do                     # Run for as long as nessesary
  if [ -f /path/to/file ]; then        # If fileexists
    echo "Found file"                  # Notify and stop monitoring
    exit 0
  fi
  sleep 5                             # Else wait 5 secs
done

関連情報