3

Под Raspbian я использую приложение с закрытым исходным кодом, которое записывает некоторые временные файлы на диск, выполняет небольшую работу, а затем быстро уничтожает их. Я хотел бы проверить эти промежуточные продукты, поэтому я надеюсь, что есть способ перенаправить записи или иным образом сделать постоянные временные файлы.

До сих пор я использовал opensnoop для подтверждения существования и расположения временных файлов.

Какие-либо предложения? У меня есть возможность сделать это на OSX, если это проще. ТИА.

2 ответа2

2

Вы можете подключиться к 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/ .

Редактировать: Вы также можете запустить (быстрый) цикл 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 Теперь, когда цикл все еще работает, запустите вашу программу и, если необходимо, скопируйте временные файлы, затем возобновите процесс, чтобы завершить его и завершить без ошибок.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .