Как определить, откуда приложение запущено?

1

Когда я набираю имя некоторого исполняемого файла в командной строке, и он запускается, как я могу определить путь, где расположен этот исполняемый файл?

user626528
источник
2
Я думаю, на ваш вопрос уже есть ответ здесь: serverfault.com/questions/232762/…
obeliksz

Ответы:

3

Вы можете узнать, какой исполняемый файл будет запущен с помощью команды

which <command>

Если вы хотите определить путь программным путем, вы используете неправильный обмен стека.

Уве Плонус
источник
3
Если вы передаете опцию -a, отображаются все возможные совпадения. И есть также, whereisкто ищет руководства и источники, тоже.
Scai
3

Проблема простого решения

whichcommandнаходит исполняемый файл данного commandв вашем $PATH. К сожалению, это не будет работать, как ожидалось, во всех случаях.

Когда commandэто псевдоним или функция, вы не получите правильный результат, потому что сам исполняемый исполняемый файл может иметь совершенно другое имя. Например, во многих дистрибутивах Linux llпсевдоним установлен по умолчанию. which llничего не находит. Еще один проблемный случай, когда ваша оболочка ведет себя нестандартным образом и не запускает первый commandнайденный в $PATH.

Более надежное решение

В Linux, если вы хотите быть полностью уверены в пути к исполняемому файлу запущенного процесса, вы можете получить его из его PID (ID процесса; в приведенном ниже примере вместо числа введите $PID:)

readlink /proc/$PID/exe

Как получить номер? PID последнего запуска процесса в оболочке в фоновом режиме $!. Небольшая демонстрация:

sleep 20 &
readlink /proc/$!/exe

Вы можете получить PID других процессов, например, из списка процессов, используя ps -ef.

Объяснение: /proc/$PID/exeэто символическая ссылка на исполняемый файл запущенного процесса. Команда readlinkпоказывает цель, на которую указывает символическая ссылка.

Скрипты - это особый случай

К сожалению, readlink /proc/$PID/exeметод не работает должным образом с языками сценариев, такими как bash, Perl, Python и т. Д. В таких случаях вы получите путь к интерпретатору сценария (например /bin/bash) вместо пути к сценарию. Чтобы приблизиться к информации, вы можете использовать:

cat /proc/$PID/cmdline     # the commandline with the interpreter and script
readlink /proc/$PID/cwd    # the current working directory

К сожалению, текущий рабочий каталог может измениться с момента запуска программы. Некоторые интерпретаторы, такие как bash, могут сохранять файл сценария открытым в дескрипторе 255:

readlink /proc/$PID/fd/255

Все может измениться

Может вызвать любой процесс, exec()который заменяет его /proc/$PID/exe, /proc/$PID/cmdlineи другую информацию.

pabouk
источник