在 Raspbian 下,我使用一个闭源应用程序,它将一些临时文件写入磁盘,进行一些工作,然后快速销毁它们。我想检查这些中间产品,所以我希望有一种方法可以重定向写入或以其他方式使临时文件持久化。
到目前为止,我已经使用 opensnoop 来确认临时文件的存在和位置。
有什么建议吗?如果更方便的话,我可以选择在 OSX 上执行此操作。TIA。
答案1
您可以挂接 write() 和所有类似函数。使用 LD_PRELOAD,您可以重定向 libc 函数,并根据需要写入数据,然后将应用程序传递给真正的 write() 函数 - 例如。我假设您的程序是动态链接的。请参阅https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/。
编辑:您还可以在 temp. 目录中启动(快速)bash 循环,并在短时间内对感兴趣的文件设置用户不可变标志。
cd /tmp ; while true ; do chflags uchg foo* ; sleep 0.01 ; done
这可能会破坏您的应用程序,或者可能会忽略其内部删除错误。要清除标志,请使用nouchg
。
答案2
最简单的解决方案是暂时暂停程序,直到检查完临时文件为止。但请注意,此后程序可能无法正确恢复,因此如果它打开任何重要的用户文件,请务必事先备份这些文件以避免损坏。
假设您的程序名为prog
。要暂停程序,请kill -TSTP $(pidof prog)
在程序运行时运行。完成后,使用 恢复程序kill -CONT $(pidof prog)
。
由于您已经知道位置(并且可能是临时文件的名称),您可以通过使用 while 循环来“保护”它,从而使其更加精确,如下所示:
while [ ! -f /path/to/temp_file ]; do echo -ne 'Waiting for file...\r'; done ; kill -TSTP $(pidof prog)
循环while
将持续运行,直到临时文件存在,然后才会kill
执行以发送TSTP
信号。现在,在循环仍在运行的情况下,运行程序并根据需要复制临时文件,然后恢复该过程以使其完成并干净地终止。