質問: プロセスの開いているファイルをリアルタイムで監視するにはどうすればよいですか? linuxマシンでその瞬間にlsofを使用してプロセスの開いているファイルを表示できることを知っています。ただし、プロセスはファイルをすばやく開いたり、変更したり、閉じたりすることができるため、標準のシェルスクリプト(例:watch)を使用して監視すると、ファイルを確認できません "monitor open 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といくつかのフラグを使用して、すべてのシステムコールを表示しないようにすることはできますか?
回答: で実行するstrace -e trace=open,close,read,write,connect,accept your-command-here おそらく十分でしょう。プロセスがstderrに出力できる場合は、-oオプションを使用して、コンソール以外の場所にstraceの出力を配置する必要があります。プロセスが分岐する場合は、-fまたは-ffも必要です。また、-tも必要になる可能性があるため、when呼び出しが発生したことがわかります。プロセスによっては、関数呼び出しリストを微調整する必要があることに注意してください。たとえば、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