Як я можу знати абсолютний шлях запущеного процесу?


93

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

Відповіді:


110
% 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 корінь кореня 0 1 лютого 18:05 / proc / 24466 / exe -> /package/admin/daemontools-0.76/command/supervise

1
У моїй системі (ubuntu 14.04) вам не потрібно бути надруковим для запуску lsкоманди.
jarno

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

3
ця відповідь потребує більшого оновлення ..
Kokizzu

8
@Kokizzu Ні, це не тому, що він зовсім не відповідає на питання. Яка команда говорить лише про те, який двійковий файл буде запускатися, якщо виконувати команду зараз. Питання полягало в тому, "який двійковий файл вже працює". Уявіть, наприклад, що на комп’ютері є десяток jdks. Якщо ви хочете дізнатися про запущений процес Java, з якого jdk він взятий, що вам у цьому не допоможе. Він лише скаже вам, з якого jdk він буде взято, якщо виконати його зараз. Прийнята відповідь також є правильною.
noamik

Очевидно, що ця відповідь неправильна: на своїй машині я запускаю процеси з різними версіями JDK та деякими 32-бітними / 64-бітовими. Якщо я хочу визначити правильну версію jstack / jmap для процесу, відповідь вище не буде працювати, тоді як прийнята відповідь буде.
Даніель Да Кунья

@Kokizzu Це відповідає лише на питання: "Який поточний робочий каталог цього процесу $pid?" Відредагований пост все ще не відповідає на запитання. whichпросто говорить: "Якщо команда на шляху, то що це?"
Джон Строд

pwdxповерніть мені абсолютний шлях виконуваної програми процесу залежно від pid на redhat x64 6.3.
Нік Донг

14

Один із способів - ps -ef


5
не працювало на конкретну службу, вона просто надала відносний шлях
Jader Dias

Допоміг мені визначити процес за допомогою команди, з якої він був запущений.
jpierson

6

1
не показує ВСЕ повних кваліфікованих шляхів на моєму Linux: "root 24466 0.0 0.0 1476 280? S 2009 0:00 контролювати sshd", наприклад
akira

Це точніше, ніж інші відповіді ... можливо, не настільки корисна, але більше правильна відповідь. Отримано.
Джон Хант

2

Швидка відповідь - використання psпараметрів або інформації про /procфайлову систему. Це, як правило, спрацює, але не гарантується. Загалом однозначної, гарантованої відповіді немає. Наприклад, що робити, якщо виконуваний файл буде видалений під час виконання, щоб не було шляху до файлу?

Див . Поширені запитання про Unix для отримання більш детальної інформації, зокрема питань 4.3 та 4.4.


2

Чому всі очікують, що ти знатимеш PID? Ось дружній для людини спосіб:

pwdx `pgrep ###process_name###`

У запитанні зазначено "як я можу бачити ps", тому він, ймовірно, відобразить PID
Scz

Ах, правда, правда. Я все ще вважаю, що це більш швидкий один вкладиш у багатьох моїх випадках використання.
moodboom

1

lsof - це варіант. Ви можете спробувати щось на кшталт нижче:

lsof -p PROCESS_ID

Тут буде перераховано всі файли, відкриті процесом, включаючи фактичне місцезнаходження виконавчого файла. Тоді можна додати ще кілька awk, cut, grep тощо, щоб дізнатися інформацію, яку шукаєте.

Як приклад, я виконав наступні команди, щоб визначити, звідки взявся мій процес "java":

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


Чим це відрізняється від вже опублікованих відповідей?
Pimp Juice 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 - це процес.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.