Я понимаю, что для исполняемого файла может быть редкая ситуация с пробелами, но это может произойти.
Примером может быть лучшее объяснение ..
Используя стандартные инструменты, я хочу определить местоположение (в файловой системе) исполняемого файла, которому принадлежит (?) Текущее окно .. .
xdotool
getactivewindow) wmctrl
-p -l | sed ... ID .... ps
-A ... здесь - вот где я сталкиваюсь с проблемами! Несмотря на то, что ps
, перечисляя только имя исполняемого файла (-o ucmd
), оно усекает имя до 15 символов, поэтому это исключает эту опцию для любого более длинного имени. ] Расширение столбца (-o ucmd:99
) не имеет значения. Если pgrep
что-то пройти, его соответствие ограничено 15 из-за stat
(см .: info pgrep) ..
Списки в вариантах «полного» режима (например, -A w w
) бесполезны, когда в соответствующем имени есть пробелы, потому что это имя отделено от его аргументов другим пробелом ! .. A Таким образом, в «полном» режиме, если процесс был запущен по ссылке, отображается имя ссылки, а не имя исполняемого файла.
Есть ли способ сделать это (используя стандартные инструменты)? ... или здесь пробелы?
Все утилиты получают свою информацию от /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
аргумент.(deleted)
к цели ссылки.argv[0]
в C). Процесс может изменить его свободно.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}')"