У меня есть программа, которую я пытаюсь запустить, однако, когда я ее запускаю; он просто жалуется, что не может найти конкретный файл.
Однако я понятия не имею, в какую папку он пытается найти этот конкретный файл. У меня есть копия требуемого файла, мне просто нужно знать, в какую папку его тоже скопировать.
Есть ли способ показать в режиме реального времени, к каким файлам обращаются или какие файлы пытаются получить доступ и не удается получить доступ?
Я использую файловую систему Ext4, если это помогает.
Благодаря
(Я впервые поместил свой ответ на этот askubuntu question, но удалил его оттуда и поместил здесь, так как он более актуален. )
Есть несколько способов узнать, какие файлы и библиотечные процессы открылись; основными инструментами являются lsof
, strace
и ltrace
. Иногда их необходимо запускать с sudo
, поэтому программа имеет доступ ко всему, что ей необходимо для получения точного снимка того, что вызывает программа.
1) С помощью lsof
нужно найти идентификатор запрашиваемого процесса, поэтому используйте, например:
lsof -c firefox
, который перечислит все файлы firefox
, которые открыты, и все ее обращения к системным разделяемым библиотекам. (В настоящее время Firefox имеет пид 3310 на моей системе, так что вы также можете использовать lsof -p 3310
, но сначала вам пришлось бы искать идентификатор процесса с помощью ps aux | grep [f]irefox
.
). Более подробная информация о lsof
подробно изложена в этой полезной IBM статье .
2) ltrace
и strace
имеют очень похожие функции и опции, и очень полезны для получения подробной информации о том, что вызывает процесс. Основное отличие заключается в том, что ltrace
обычно отслеживает только вызовы библиотеки (хотя она может отследить системные вызовы с опцией
-S
), в то время как strace
отслеживает как вызовы библиотеки , так и другие вызовы
системы
. Более подробная информация о процессах трассировки доступна в данной статье IBM. Lsof
, вероятно, более полезен для вас, если вы хотите изучить уже запущенный процесс, но strace
также может сделать это и следить за вызовами в реальном времени, когда дается pid процесса (sudo всегда используется при подключении к процессу):
sudo strace -p 3310
, но гораздо полезнее запустить программу с strace
и посмотреть, что было вызвано, как в следующем примере:
strace -f -e trace=open /usr/bin/firefox
Можно просто запустить strace
с целевым процессом и без опций, но переключатели здесь означают, что отслеживаются дочерние процессы (-f
) и что отслеживаются все открытые системные вызовы (-e trace=open
).
Если вы хотите сохранить вывод в файл, вы можете указать -o ~/firefox.trace
перед указанием /usr/bin/firefox
.
Если вам нужен сводный список вызовов библиотек, например, вы можете использовать
ltrace -c /usr/bin/leafpad
, а затем выйти из программы, и список будет составлен. Опустите опцию -c
для просмотра вызовов в режиме реального времени.
Результаты strace
и ltrace
могут быть не очень полезны для вас, так как их трудно расшифровать, если вы не знаете, что вы ищете, но lsof
должен предоставить некоторую основную полезную информацию.
Самый простой способ сделать это - это запустить программу через strace
и наблюдать за вызовами stat64() (которые получают информацию о файле) или open() вызовами, которые открывают файлы.
Итак, вы делаете:
strace -e stat64 -e open [program name]
И в результирующем выходе ищете:
(Нет такого файла или директории)
Путь, который он пытался открыть, должен быть слева от этой ошибки.