Получить полный путь к исполняемому файлу запущенного процесса в AIX - PullRequest
5 голосов
/ 21 июня 2011

Это наиболее похоже на Получить полный путь к исполняемому файлу запущенного процесса на HPUX… , за исключением AIX.

Основной вопрос: как в AIX я могу определить полный путь к текущему исполняемому файлу? Необходимость сделать это, прежде чем делать что-либо еще (например, chdir), это нормально.

Самый точный ответ, который я нашел на данный момент, это проверить вывод
svmon -P $$ -O format=nolimit,filename=on,filtertype=client
(где $$ имеет значение оболочки: текущий pid). Это не только большое количество C, но svmon также не очень быстр и может легко перегружать время выполнения остальной части приложения.

Следующий лучший ответ, по-видимому, заключается в простом взгляде на argv[0], и, если в нем есть косая черта, это либо полное имя пути (начинается с ведущего /), либо относительно-текущего-каталога имя (не начинается с ведущего /). Если в нем нет косой черты, это относительно чего-то в PATH.
И если после этого разрешения я получу символическую ссылку, то будет иметься также все разрешение символических ссылок (жесткие ссылки, вероятно, выходят за рамки любого решения). Это решение выглядит как относительно кроссплатформенное, но также очень тяжелое в коде C (должно быть быстрее, чем svmon). И я ожидаю, что есть расовые условия и тому подобное.

Спасибо

Обновление : Я ищу решение для отправки разработчикам Perl. И они будут беспокоиться о небезопасных PATH, особенно в setuid / setgid сценариях. См. perlsec . Я думаю, что у нас все может быть хорошо, но если вы объедините setuid с фальшивкой argv[0], вы можете заставить Perl думать, что это где-то еще, и загружать неправильные модули. Приведенный выше «следующий лучший» ответ действительно работает только тогда, когда он не в режиме заражения Perl.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2015

Используйте ps для получения адреса исполняемого пути

ps -aef | grep app | awk '{print $ 8}'

Команда

выше дает адрес пути к исполняемому файлу вашего приложения

0 голосов
/ 21 июня 2011

Почему вы не можете использовать опции ps в качестве базовой линии?Конечно, вам все еще нужно обработать значение cmd, чтобы увидеть, имеет ли начальный символ '/' или нет.Что-то вроде

ps -o pid,env,cwd,cmd | grep youAppName | awk -f programToRationalizePathName 

У меня больше нет доступа к AIX, но я работал над ним 2 с половиной года, и я знаю, что использовал эту функцию.Я не думал, что это было медленно, но у меня могли быть другие требования, чем у вас.

У меня сложилось впечатление, что вам нужна служебная функция, вызов по одному, который возвращает полный путь, но если вам нужен постоянный процесс и вас беспокоит перезапуск ps каждую 1 минуту (например), посмотрите на специфическую для AIX утилиту nmon.Не уверен, что он может генерировать вывод, подобный ps -o cmd, но его можно настроить так, чтобы он работал столько, сколько вы хотите, так часто, как вы хотите (с интервалом до 1 секунды), и это всего лишь один процесс, вывод которого может бытьперенаправляется по мере необходимости.(Nmon не является частью установки std, но большинство организаций ее устанавливают, поскольку она благословлена ​​IBM (если не поддерживается напрямую)).

Конечно, все «не 100%» предостережения применяются изпохожие вопросы, упомянутые вами и в комментариях.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...