Как я могу получить аргументы команды или всю командную строку из запущенного процесса, используя его имя процесса?
Например этот процесс:
# ps
PID USER TIME COMMAND
1452 root 0:00 /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid
И то, что я хочу, это /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid
аргументы. Я знаю имя процесса и хочу его аргументы. Я использую Busybox на SliTaz.
ps
(не рекомендуется) или вы ищете какую-то альтернативную командуps
, которая даст вам вывод? Что нужно сделать, когдаps
выдает несколько строк вывода? распечатать все / первое / последнее?arg
какcommand
в ответе @John ?pidof <process name>
ps -o pid, args | grep $ PID | tr -s "" | cut -d "" -f 2 Но таким образом я не получаю аргументы в одной переменнойОтветы:
Вы можете использовать
-o
переключатель, чтобы указать формат вывода:Со страницы руководства :
Вы также можете использовать
-p
переключатель для выбора определенного PID:pidof
также может использоваться для переключения с имени процесса на PID, что позволяет использовать-p
имя с именем:Конечно, вы также можете использовать
grep
для этого (в этом случае вы должны добавить-e
переключатель):GNU PS также позволит вам удалить заголовки (конечно, это не нужно при использовании
grep
):В других системах вы можете передавать в AWK или sed:
Редактировать: если вы хотите перехватить эту строку в переменной, просто используйте
$(...)
как обычно:или с помощью
grep
:источник
args
наcommand
(илиcmd
).cmd
и другоеcommand
- псевдонимыargs
, это, вероятно, не нужно.grep
чтобы поймать линию вы на самом деле интересно:ps -eo args | grep dhcpcd | head -n -1
. Я отредактировал свой ответ.Попробуйте что-то вроде этого:
(пример вывода из busybox на OpenWrt на одном из моих маршрутизаторов)
/proc/$PID/cmdline
содержит аргументы процесса,$PID
такие как строки C-ish один за другим. Каждая строка заканчивается нулем.Кавычки вокруг некоторых аргументов или опций являются оболочкой. Вы должны посмотреть ближе на показанные строки и где используются пробелы или другие символы с особым значением для оболочки. Вам нужно будет как-то заключить в кавычки эти символы или полный аргумент при повторном присоединении этих строк к командной строке.
источник
tr "\0" " " </proc/991/cmdline
\0
на ``, чтобы быть плохим, но я думаю,tr '\0' '\n' < /proc/$foo/cmdline
что это немного проще, чемxargs
.printf
упрощает добавление кавычек в вывод, вставку пробела вместо новой строки и так далее. Если подумать о добавлении дополнительной обработки, тоprintf
это хороший старт.Метод № 1 - Использование PS
Вы могли бы использовать
ps -eaf | grep 1234
.пример
ПРИМЕЧАНИЕ: Busybox
ps
не включает в себя-eaf
переключатели, как показано выше, от типового,ps
который включен в большинство Linux, однако Busyboxps
показывает то, что похоже на вывод, очень похожий на приведенный мной пример. Вы можете установить Busybox на большинство Linux и запустить его так:Метод № 2 - Использование / proc
Вы также можете посмотреть
cmdline
файл, под которым находится каждый PID/proc/<pid>
.Но обратите внимание, что он пропустил интервал. Это связано с тем, что в этом файле используется символ NUL для разделения аргументов командной строки. Не волнуйтесь, их можно убрать.
Ссылки
источник
Зная PID, просто exec
Например, для PID = 127
источник