Могу ли я использовать стандартные инструменты, чтобы получить полное имя процесса, если в его имени есть встроенные пробелы?

Я понимаю, что для исполняемого файла может быть редкая ситуация с пробелами, но это может произойти.

Примером может быть лучшее объяснение ..

Используя стандартные инструменты, я хочу определить местоположение (в файловой системе) исполняемого файла, которому принадлежит (?) Текущее окно .. .

  1. получить текущий идентификатор окна ... (xdotool getactivewindow)
  2. использовать идентификатор для получения PID ... (wmctrl -p -l | sed ... ID ....
  3. используйте PID для получения имени исполняемого файла ... (ps -A ... здесь - вот где я сталкиваюсь с проблемами!
  4. ]

Несмотря на то, что ps, перечисляя только имя исполняемого файла (-o ucmd), оно усекает имя до 15 символов, поэтому это исключает эту опцию для любого более длинного имени. ] Расширение столбца (-o ucmd:99) не имеет значения. Если pgrep что-то пройти, его соответствие ограничено 15 из-за stat (см .: info pgrep) ..

Списки в вариантах «полного» режима (например, -A w w) бесполезны, когда в соответствующем имени есть пробелы, потому что это имя отделено от его аргументов другим пробелом ! .. A Таким образом, в «полном» режиме, если процесс был запущен по ссылке, отображается имя ссылки, а не имя исполняемого файла.

Есть ли способ сделать это (используя стандартные инструменты)? ... или здесь пробелы?

6
задан 15 January 2011 в 20:08

2 ответа

Все утилиты получают свою информацию от /proc/$PID так или иначе, но существует (по крайней мере) три места в /proc/$PID это содержит название исполняемого файла в некоторой форме, и они сообщают другую информацию.

  • Name поле в /proc/$PID/status (также доступный в более твердой к синтаксическому анализу форме в /proc/$PID/stat). Это - название исполняемого файла, но усеченный к 15 символам. Так как ядро выполняет усечение, никакую опцию к ps может помочь. Это что ps -o comm (или его синоним ps -o ucmd) шоу.
  • Символьная ссылка /proc/$PID/exename укажите на исполняемый файл. Можно получить его содержание с readlink /proc/$PID/exename. В отличие от информации, сообщенной ps, только у пользователя, выполняющего процесс, есть разрешение считать цель ссылки.
  • Нулевой аргумент процессу, как выбрано оболочкой или другой программой, которая вызвала его. Условно, оболочки выбирают название исполняемого файла, когда Вы ввели его (с или без полного пути). Можно получить все аргументы от ps с ps -o cmd (или его синоним ps -o command), но аргументы разделяются пробелами, таким образом, Вы не можете надежно сказать, где нулевой аргумент останавливается. Можно считать аргументы от /proc/cmdline, где они разделяются нулевым символом: </proc/$PID/cmdline awk -vRS='\0' '{print; exit;}' извлекает нулевой аргумент.

Для полноты позвольте мне упомянуть, что эти имена могут измениться в течение времени жизни процесса, хотя большинство программ не делает этого:

  • Процесс может измениться Name поле /proc/$PID/status путем вызова prctl с PR_SET_NAME аргумент.
  • Исполняемый файл может быть переименован или удален. В простых случаях Linux отслеживает новое имя (но пограничные случаи не могли бы работать, например, если Вы делаете жесткую ссылку на исполняемый файл). Если файл удален, добавляет ядро (deleted) к цели ссылки.
  • Нулевой аргумент процессу читается из памяти процесса (это argv[0] в C). Процесс может изменить его свободно.
7
ответ дан 15 January 2011 в 20:08
ps $PID | tail -1 | awk '{i=5; while (i<NF) {printf "%s ", $i; i++}; print $NF}'

Где $ PID - это PID, который у вас есть. Вероятно, вам нужна полная команда (на основе вашего вопроса выше):

which "$(ps $(xdotool getwindowpid $(xdotool getactivewindow)) | tail -1 | awk '{i=5; while (i<NF) {printf "%s ", $i; i++}; print $NF}')"
0
ответ дан 15 January 2011 в 20:08

Другие вопросы по тегам:

Похожие вопросы: