プロセスの開いているファイルをリアルタイムで監視するにはどうすればよいですか?


41

Linuxマシンlsof でその時点で使用しているプロセスの開いているファイルを表示できることを知っています。ただし、プロセスはファイルを非常に迅速に開いたり、変更したり閉じたりすることができるためwatch「Linuxで開いているプロセスファイルを監視する(リアルタイム)」で説明されているように、標準のシェルスクリプト(たとえば)を使用して監視すると表示できません。

だから、私はプロセスを監査する簡単な方法を探していて、それが時間の経過とともに何をしてきたかを見ると思います。監査を開始せずにプロセスを実行する時間をとる前に、どのネットワーク接続(試行)が行われたかを確認し、監査を開始できるようにすることもできれば素晴らしいことです。

理想的には、私はこれをしたいと思います:

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling

straceすべてのシステムコールを表示しないフラグといくつかのフラグを使用してこれは可能でしょうか?


回答:


50

で実行する

strace -e trace=open,close,read,write,connect,accept your-command-here

おそらく十分でしょう。

-oプロセスがstderrに出力できる場合、コンソール以外の場所にstraceの出力を配置するオプションを使用する必要があります。プロセスが分岐する場合は、-fまたはも必要-ffです。

ああ、あなたも望むかもしれない-tので、いつ電話がかかったかを見ることができます。


注意、あなたのプロセスが何をするかに応じて、関数呼び出しのリストを微調整する必要があるかもしれません-私は追加する必要がgetdents使用してより良いサンプルを取得するには、例えばls

$ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@V\0\0\0\0\0\0"..., 832) = 832
09:34:48 close(3)                       = 0
...
09:34:48 open("/proc/filesystems", O_RDONLY) = 3
09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366
09:34:48 read(3, "", 1024)              = 0
09:34:48 close(3)                       = 0
09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
09:34:48 getdents(3, /* 5 entries */, 32768) = 144
09:34:48 getdents(3, /* 0 entries */, 32768) = 0
09:34:48 close(3)                       = 0
09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21
09:34:48 close(1)                       = 0
09:34:48 close(2)                       = 0

1
それは正しい方向に向かっています、ありがとう!よりユーザーフレンドリーな出力が必要ですが、それは仕事をします。このために、よりトップに近いインターフェースを備えたツールを作成するのに時間がかかるかもしれません。バイナリのアクションをリアルタイムで検査するために、ncursesベースまたは「トップ」のようなツールが存在することを望んでいました。
gertvdijk

どのように見えますか?straceの出力をより使いやすいものに変更することはおそらく可能です。
役に立たない

あなたは間違いなく-o出力をファイルにプッシュするために使用したいです。その後tail -F strace.output、別のターミナルで実行して、「ライブ」アップデートを取得できます。
ペテルフ

4
オプションでstrace実行中のプロセスにアタッチすることもでき-p PIDます。
フランクブライトリング

追加-y「ファイルディスクリプタの引数に関連付けられている[P] RINTパス」に
ricab
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.