Можно ли найти путь работающей программы?


17

У меня xmms2dзапущен процесс, но два возможных исполняемых файла (в разных каталогах, оба в пути к исполняемому файлу), которые могли его породить. Я подозреваю, что один из них поврежден, потому что иногда эта программа работает, а иногда нет. Теперь запущенный процесс работает, поэтому я хочу удалить (или переименовать) другой.

ps ax|grep "xmms"возвращается 8505 ? SLl 2:38 xmms2d -vбез информации о пути. Учитывая PID, могу ли я узнать, был ли он запущен /usr/bin/xmms2dили /usr/local/bin/xmms2d?

Благодарность!


2
ps -C xmmsдолжен сделать ваш grep устаревшим.
пользователь неизвестен

1
pgrep сделает это тоже.
Jlliagre

Ответы:


22

Попробуй это:

ls -l /proc/8505/exe

Или, если вы не хотите анализировать вывод ls, просто выполните:

readlink /proc/8505/exe

или

realpath /proc/8505/exe

6

Если вы работаете с Solaris, то путь немного отличается от предложенного в Linux:

$ for i in $(pgrep bash)
do
  printf "%6d %s\n" $i $(readlink /proc/$i/path/a.out)
done
   577 /usr/bin/bash
 11247 /usr/bin/bash
 13921 /usr/bin/bash
 13992 /tmp/bash

Если вы хотите узнать текущий рабочий каталог запущенных процессов, вы можете использовать:

pwdx $(pgrep xmms)

например:

$ pwdx $(pgrep ksh)
2904: /home/jlliagre
2906: /home/jlliagre
3844: /tmp

(удалил мой комментарий, поскольку он больше не применяется после вашего редактирования :)
Kjetil Jorgensen

-1

Я запускаю коврик для мыши из оболочки:

mousepad & 
[1] 24289

проверьте, откуда это берется:

which mousepad 
   /usr/bin/mousepad

начните с пути:

/usr/bin/mousepad &

посмотри через пс:

ps v -C mousepad 
  PID TTY      STAT   TIME  MAJFL   TRS   DRS   RSS %MEM COMMAND
24289 pts/3    S      0:00      3    62 85441 10964  1.0 mousepad
24292 pts/3    S      0:00      0    62 85433 10864  1.0 /usr/bin/mousepad

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

which mousepad

Все просто, не правда ли? Подождите! Что делать, если я запускаю коврик для мыши из меню? Ну, это может быть указано с или без использования параметров PATH. Я старался. Нормальный запуск приводит к простой «коврик для мыши» в ps v -C. Поскольку ~ / bin является первой частью моего PATH, я создаю там пустышку, и, вуаля, пустышка запускается из меню.

Но что, если вы запустите программу, которая удаляет себя? Который не найдет удаленную программу и сообщит о неправильной, если в пути есть секунда.

Так что это условие гонки. Если вы знаете , что ваши программы не удалять себя или не перемещаются , пока вы исследуете свое местоположение, ps v -C NAMEи which NAMEдолжны работать очень хорошо.


Будет ли это всегда работать? Предположим, у меня есть исполняемый файл в двух разных каталогах, и я работаю ./someexecutableв обоих?
apoorv020

Нет, конечно, нет, потому что оба будут отображаться как ./someexecutable или / bin / bash ./someexecutable
пользователь неизвестен

-4

Идите дальше и удалите оба файла (без принудительной опции -f). Файл, который был удален, является тем, который не был запущен !!

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


Ваш ответ не дает реального ответа на вопрос.
Ристо Салминен

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

1
Это тревожно неправильно - не делайте этого
Майкл Мрозек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.