Чи можливо знайти шлях запущеної програми?


17

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

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

Спасибі!


2
ps -C xmmsмає зробити ваш греп застарілим.
користувач невідомий

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:

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). Видалений файл - це той, який не працює !!

Блокування системного виконуваного файлу не дозволить видалити жоден файл, який наразі виконується.


Ваша відповідь не дає реальної відповіді на питання.
Risto Salminen

4
Це також неправильно. Ви можете видалити запущені виконавські файли без проблем. Як ви думаєте, як такі пакети, як init, які завжди запущені, оновлюються? Ви не можете змінити запущений виконуваний файл.
Патрік

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