Если я вижу процесс, выполняющийся с использованием ps, как мне найти исполняемый файл?

11

Если я вижу процесс, использующий использование ps -e, как я могу найти файл, который запустил его?

Interstar
источник
2
Что это за ОС? Linux, BSD, Solaris ...
Патрик
Linux ... но решения кросс-Unix приветствуются.
межзвездный

Ответы:

15

В Linux: если вы знаете PID, вы можете указать файл cmdline для этого файла. Например:

cat /proc/PID/cmdline

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

И конечно:

lsof -n | grep PID | grep ' txt '

и:

ls -la /proc/PID/exe

которая является символической ссылкой на исполняемый файл.

Фолькерт ван Хеусден
источник
1
Обратите внимание, что в нем /proc/PID/cmdlineнет символа новой строки, поэтому вы, вероятно, захотите сделать что-то подобное cat /proc/PID/cmdline ; echo ''.
Кит Томпсон
На самом деле, в нем есть NUL-символы, разделяющие аргументы, так что вы можете захотеть что-то еще более сложное, напримерtr '\0' ' ' < /proc/PID/cmdline ; echo ''
Кит Томпсон,
2

Скопируйте идентификатор процесса из ps -eкоманды, а затем выполните следующее:

ps x | grep <process-id>
Адитья Патавари
источник
Разве это не сработает, если приложение редактирует argv [0]? iirc sendmail делает это.
Фолькерт ван Хойсден
Да, это вероятность. Тем не менее, это пригодится почти каждый раз.
Адитья Патавари
0

Ни один из методов ( ls, lsofили cat) в других ответов не работает для меня. Если я сделаю:

$ nano test.txt

Это мой победитель

$ pgrep -f -l test
3074 nano test.txt

Или, чтобы получить только PID, чтобы использовать его в программировании:

$ pgrep -f test
3074

Протестировано на Kali Linux v1.0.6 (на основе Debian).
По сравнению с простым ls, я должен признать, что это не очень портативное решение, но, по крайней мере, оно работает.

Сопалахо де Арриерес
источник