Как я могу узнать абсолютный путь запущенного процесса?

93

Если у меня есть несколько копий одного и того же приложения на диске, и, как я вижу ps, запущено только одно, как я могу узнать абсолютный путь, чтобы отличить его от других?

Джадер Диас
источник

Ответы:

111
% sudo ls -l /proc/PID/exe

например:

% ps -auxwe | grep 24466
корень 24466 0,0 0,0 1476 280? S 2009 0:00 контролировать sshd
% sudo ls -l / proc / 24466 / exe
lrwxrwxrwx 1 root root 0 фев 1 18:05 / proc / 24466 / exe -> /package/admin/daemontools-0.76/command/supervise
Акира
источник
1
В моей системе (Ubuntu 14.04) вам не нужно быть суперпользователем для запуска lsкоманды.
Ярно
3
@jarno ls: cannot read symbolic link /proc/28783/exe: Permission denied- дело не в запуске lsкоманды, а в доступе к информации о процессе, не принадлежащем вам. На моем компьютере около 97% всех процессов, перечисленных в / proc, являются корневыми процессами, а остальные распределены по 11 различным пользователям.
Ирфи
20

Использование:

pwdx $pid

Это дает вам текущий рабочий каталог pid, а не его абсолютный путь.

Обычно whichкоманда скажет вам, что вызывается из оболочки:

#> which vlc
/usr/bin/vlc
Seenu
источник
3
этот ответ нужно больше upvote ..
Kokizzu
8
@ Kokizzu Нет, это не потому, что не отвечает на вопрос вообще. Команда which сообщает вам, какой двоичный файл будет запущен, если вы выполните команду сейчас. Вопрос был в том, «какой двоичный файл там уже запущен». Представьте себе, например, наличие дюжины JDK на вашем компьютере. Если вы хотите узнать для запущенного процесса Java, из какого jdk он был взят, это вам не поможет. Он только скажет вам, из какого jdk он будет взят, если вы выполните его сейчас. Принятый ответ также является правильным.
noamik
Очевидно, что этот ответ неверен: на моей машине я запускаю процессы с разными версиями JDK и некоторыми 32-битными / 64-битными. Если я хочу определить правильную версию jstack / jmap для процесса, ответ выше не будет работать, пока принятый ответ будет.
Даниэль Да Кунья
@Kokizzu Это только отвечает на вопрос: «Каков текущий рабочий каталог процесса $pid?» Отредактированное сообщение все еще не отвечает на вопрос. whichпросто говорит "Если команда находится на пути, то что это?"
Джон Струд
pwdxверните мне абсолютный путь к исполняемой программе процесса в зависимости от pid на redhat x64 6.3.
Ник Донг
14

Одним из способов является ps -ef

fpmurphy
источник
5
не работал для конкретной службы, он просто предоставлял относительный путь
Jader Dias
Помог мне определить процесс с помощью команды, с которой он был запущен.
jpierson
5
ps auxwwwe

Источник:

https://serverfault.com/questions/62322/getting-full-path-of-executables-in-ps-auxwww-output

Джадер Диас
источник
1
не показывает ВСЕ полные пути в моем linux: "root 24466 0.0 0.0 1476 280? S 2009 0:00 supervise sshd", например
akira
Это более точно, чем другие ответы ... может быть, не так полезно, но более правильный ответ. Upvoted.
Джон Хант
2

Быстрый ответ - использовать psопции или информацию о /procфайловой системе. Это обычно работает, но не гарантируется. В общем, нет определенного, гарантированного ответа. Например, что если исполняемый файл будет удален во время выполнения, чтобы не было пути к файлу?

Смотрите Unix FAQ для более подробной информации, особенно вопросы 4.3 и 4.4.

mpez0
источник
2

Почему все ожидают, что вы знаете PID? Вот удобный для человека способ:

pwdx `pgrep ###process_name###`
moodboom
источник
Вопрос гласит «как я могу видеть ps», поэтому он, вероятно, будет отображать PID
Scz
Ах, хорошо, правда. Я до сих пор считаю, что во многих моих случаях использования это происходит быстрее.
moodboom
1

lsof это вариант. Вы можете попробовать что-то вроде ниже:

lsof -p PROCESS_ID

Это перечислит все файлы, открытые процессом, включая фактическое местоположение исполняемого файла. Затем можно добавить еще несколько awk, cut, grep и т. Д., Чтобы найти информацию, которую вы ищете.

В качестве примера я выполнил следующие команды, чтобы определить, откуда появился мой процесс java:

lsof -p 12345 | awk '{print $ NF}' | grep 'java $'

баран
источник
Чем это точно отличается от уже опубликованных ответов?
Сок Pimp IT
0

Вы могли бы использовать

readlink /proc/$(pgrep -x -U $(id -ur) APP_NAME)/exe

или же

find /proc/$(pgrep -x -U $(id -ur) APP_NAME)/exe -printf "%l\n"

чтобы получить абсолютный путь. PID - это процесс.

Ярно
источник