Как проверить, выполняется ли исполняемый файл AppImage?

Вопрос или проблема

Часто бывают ситуации (обычно программные), когда мне хотелось бы знать, запущен ли исполняемый файл с определенным именем (напоминаю об обычных оговорках о состояниях гонки). В Linux мы обычно можем использовать ps или проверять /proc/, но это не работает, если приложение находится в AppImage.

Например, фронтенд эмулятора ES-DE имеет исполняемый файл “es-de” и пакет AppImage “ES-DE_x64.AppImage”. Первый, если он установлен/распакован непосредственно на систему, можно легко проверить с помощью pgrep -x "es-de", и имена исполняемых файлов редко, если вообще когда-либо, меняются и обычно очень просты; однако, при использовании версии app image, app image вообще не отображается с pgrep, а с ps -a или ps -x мы видим только AppRun или ./ES-DE_x64.AppImage соответственно. Хотя последнее и можно проверить, файл может быть переименован пользователем или даже дистрибьютором со временем. Хотя технически это применимо и к исполняемому файлу, вероятность этого гораздо меньше.

Конечно, базовый процесс es-de также не находится в /proc/ или через ps при использовании AppImage.

Есть ли какой-то способ (желательно не специфичный для Ubuntu) запросить систему, чтобы увидеть, запущен ли es-de, даже если это происходит через AppImage. Я не против объединения проверок, так что на самом деле мне просто нужен способ увидеть, запущено ли приложение в любом активном AppImage (даже если для этого требуется итерация). Что-то вроде docker top.

AppImage не имеют особенной природы и работают как другие исполняемые файлы, и они отображаются в ps (попробуйте ps -ef?).

AppImage должен отображаться как минимум два исполняемых файла:

  • Исполняемый файл контейнера appimage, который, как вы сказали, может быть переименован пользователем
  • Внутреннее имя исполняемого файла внутри контейнера AppImage, которое нельзя переименовать без пересборки контейнера, так что вероятность его изменения гораздо меньше.

Команда pgrep часто не находит фактического имени исполняемого файла и является ненадежным тестом. pgrep -a более вероятно находит вещи, но все же не всеобъемлюще, и pgrep -x еще менее вероятно найдет то, что вы ищете, поскольку показывает только точные совпадения.

Ваш лучший вариант — запустить приложение и использовать ps на пользователе или терминале, в котором оно запущено, чтобы выяснить, каково текущее внутреннее имя приложения, а затем в будущем использовать какую-то форму ps -ef|grep ... для его поиска.

Однако обратите внимание, что нет никакого способа магически определить, является ли приложение, которое “переименовано со временем”, тем же самым приложением. Это даже не имеет смысла. Как вы могли бы узнать, что это то же самое приложение, если оно переименовано и, предположительно, это другая версия или, возможно, даже ответвление? Что вообще значит, что это то же самое приложение, если это другая версия и другое имя?

.

Ответ или решение

Чтобы узнать, запущен ли базовый исполняемый файл из AppImage, необходимо учитывать специфику этой технологии. AppImage — это формат для распространения программного обеспечения, который позволяет запускать приложения на Linux без необходимости их установки. Это достигается благодаря тому, что AppImage содержит все необходимые зависимости, упакованные вместе с самим приложением. Однако именно из-за этого традиционные методы проверки процесса через ps или /proc не всегда работают так, как ожидается, потому что вы можете увидеть процессы, связанные именно с контейнером AppImage, а не самой программы внутри него.

Теория

Во-первых, важно понимать, как функционирует AppImage. При запуске такого файла, он монтируется как виртуальный файловый образ, после чего запускается определенный исполняемый файл внутри этого образа. Вот почему стандартные команды вроде pgrep -x "имя_файла" или ps показывают процессы контейнера (например, AppRun), а не внутреннего приложения. Это приводит к тому, что идентификация конкретного исполняемого файла внутри AppImage становится сложной задачей.

Пример

Рассмотрим AppImage с именем ES-DE_x64.AppImage, который содержит исполняемый файл с именем es-de. При его запуске через AppImage, вы можете видеть процесс ./ES-DE_x64.AppImage или AppRun, но не es-de, из-за чего стандартные методы поиска через pgrep могут не сработать. Чтобы идентифицировать процесс именно по имени исполняемого файла внутри AppImage, возможны следующие шаги:

  1. Ручной поиск: Запустите AppImage и используйте ps -ef для просмотра всех процессов и их аргументов. Это позволит вам выяснить, что именно запускается под капотом и какие действия выполняются.

  2. Поиск по аргументам: Используйте ps -ef | grep ваш_файл. Это позволит вам просмотреть процессы и проверить, находится ли нужный вам исполняемый файл среди аргументов команд, запускаемых пользователем.

Применение

Для автоматизации определения, запущен ли исполняемый файл внутри AppImage, можно разработать скрипт, который будет выполнять следующее:

  • Монтирование AppImage для изучения содержимого: Монтируйте образ вручную (например, с помощью --appimage-mount) и изучите его содержимое, чтобы точно разобраться, где находится интересующий вас исполняемый файл.

  • Нахождение пути внутреннего исполняемого файла: После монтирования AppImage можно использовать команду find или ls для поиска исполняемых файлов. При этом следует обращать внимание на те из них, которые тем или иным образом связаны с функциональностью, обеспечиваемой приложением.

  • Изучение переменных окружения: Различные AppImage при запуске могут оставлять специфичные следы в системных переменных окружения. Ознакомьтесь с переменными, такими как APPIMAGE, чтобы получить более четкое представление о специфичности вашей программы.

  • Использование ps с уникальными параметрами: Запустите ps -eo pid,args для получения подробного списка всех процессов и их аргументов. Это может помочь определить, какие конкретные исполняемые файлы внутри AppImage запущены в данный момент.

  • Создание логики для управления разными версиями и именами: Поскольку имя AppImage может изменяться, имеет смысл разработать систему, которая будет сохранять информацию о конкретных исполняемых файлах внутри AppImage по уникальным характеристикам, например, по хешам.

Заключение

Нельзя недооценивать значимость тщательного анализа процессов и понимания того, как AppImage управляет своей внутренностью. Поскольку pgrep и ps предоставляют разные уровни видимости, использование комплексного подхода может улучшить ваше понимание и контроль над процессами, запущенными посредством AppImage. Тем не менее, будьте готовы столкнуться с ограничениями, связанными с изменениями имен и версий, и имейте эффективную стратегию для управления этими изменениями.

Оцените материал
Добавить комментарий

Капча загружается...