Как получить целую командную строку от процесса?

isc-dhcp-server является новым названием пакета dhcp3-сервера, таким образом, это ведет себя как ожидалось. Сержант Debian довольно стар, таким образом, можно ожидать что учебное руководство устареть.

50
22.10.2014, 00:44
5 ответов

Вы можете использовать переключатель -o для указания формата вывода:

$ ps -eo args

Из man page:

Command со всеми его аргументами в виде строки. Могут быть показаны изменения в аргументах. [... ]

Вы также можете использовать переключатель -p для выбора конкретного ПИД:

$ ps -p [PID] -o args

pidof также может быть использован для переключения с имени процесса на ПИД, что позволяет использовать -p с именем:

$ ps -p $(pidof dhcpcd) -o args

Конечно, вы также можете использовать grep для этого (в этом случае, вы должны добавить переключатель -e):

$ ps -eo args | grep dhcpcd | head -n -1

GNU ps также позволит вам удалять заголовки (конечно, в этом нет необходимости при использовании grep):

$ ps -p $(pidof dhcpcd) -o args --no-headers

В других системах вы можете подключаться к AWK или sed:

$ ps -p $(pidof dhcpcd) -o args | awk 'NR > 1'
$ ps -p $(pidof dhcpcd) -o args | sed 1d

Edit: если вы хотите перехватить эту строку в переменную, просто используйте $(. ...)] как обычно:

$ CMDLINE=$(ps -p $(pidof dhcpcd) -o args --no-headers)

или, с помощью grep :

$ CMDLINE=$(ps -eo args | grep dhcpcd | head -n -1)
65
27.01.2020, 19:33

Попробуйте что-то вроде этого:

(например, пример выхода от Bitebox на OpenWRT на одном из моих маршрутизаторов)

root@ap8:~# xargs -0 printf '%s\n' </proc/991/cmdline
/usr/sbin/uhttpd
-f
-h
/www
-r
ap8
-x
/cgi-bin
-u
/ubus
-t
60
-T
30
-k
20
-A
1
-n
3
-N
100
-R
-p
0.0.0.0:80
-p
[::]:80

/ proc / $ PID / cmdline содержит аргументы процесса $ PID как строки C-ish один за другим. Каждая строка равен нулю.

Цитаты Враща Некоторые аргументы или варианты являются оболочками. Вы должны посмотреть ближе к показанным линиям, и где используются пробелы или другие символы со специальным значением для оболочки. Вам нужно будет процитировать этот символ как-то или полный аргумент при присоединении к этим строкам в командную строку снова.

13
27.01.2020, 19:33

Метод № 1 - Использование PS

Вы можете использовать PS-PR -AEF | GREP 1234 .

Пример

$ ps -eaf | grep 28865
saml     28865  9661  0 03:06 pts/2    00:00:00 bash -c sleep 10000; while [ 1 ];do echo hi;sleep 10;done
saml     28866 28865  0 03:06 pts/2    00:00:00 sleep 10000

Примечание: BiteBox's PS не включает в себя коммутаторы --Reaf , как показано выше, из типичного PS , который включен в Большинство Linuxes, однако, Bitebox's PS показывает, что выглядит очень похожим на вывод на пример, который я предоставил. Вы можете установить Busybox в большинстве Linuxes и запустите его так:

$ busybox ps
  852 root       0:00 /sbin/auditd -n
  855 root       0:01 /sbin/audispd
  857 root       0:00 /usr/sbin/sedispatch
  866 root       0:00 /usr/sbin/alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00main rdaemon
  867 root       0:00 /usr/libexec/bluetooth/bluetoothd
  869 root       0:01 {firewalld} /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
  871 root       0:32 /usr/libexec/accounts-daemon
  873 rtkit      0:05 /usr/libexec/rtkit-daemon
  875 root       0:00 /usr/sbin/ModemManager
  876 avahi      0:03 avahi-daemon: running [dufresne.local]
  878 root       0:54 /usr/sbin/irqbalance --foreground
  884 root       0:00 /usr/sbin/smartd -n -q never
  886 avahi      0:00 avahi-daemon: chroot helper
  891 chrony     0:01 /usr/sbin/chronyd
  892 root       0:01 /usr/lib/systemd/systemd-logind
  893 dbus       1:28 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation

Метод № 2 - Использование / proc

Вы также можете посмотреть на файл CMDLINE файл, что каждый PID имеет в / proc / .

$ cat /proc/28865/cmdline 
bash-csleep 10000; while [ 1 ];do echo hi;sleep 10;done

Но обратите внимание, что не хватает расстояния. Это связано с символом Nul, используемым в этом файле, чтобы отделить аргументы вашей командной строки. Не беспокойтесь, хотя эти могут быть выделены.

$ tr '\0' ' ' </proc/28865/cmdline
bash -c sleep 10000; while [ 1 ];do echo hi;sleep 10;done

Ссылки

13
27.01.2020, 19:33

Если вам нравятся короткие команды и доступен pgrep, я бы посоветовал pgrep -fl <process_name>.

ps -o argsусекается

2
27.01.2020, 19:33

Облегченная версия команды ps(BusyBox):

PROCNAME="udhcpc"   
CMD=$(ps | grep $PROCNAME | grep -v grep | head -n 1 | grep -o '/.*$')

Полная -версия команды ps:

PROCNAME="udhcpc"
CMD=$(ps -f --no-headers -C $PROCNAME | head -n 1 | grep -o '/.*$')

Или их комбинация. Поскольку psв BusyBox не имеет аргумента для определения версии (, он выдаст ошибку выхода ), мы можем воспользоваться этим:

PROCNAME="udhcpc"
if ps --version; then
    CMD=$(ps -f --no-headers -C $PROCNAME | head -n 1 | grep -o '/.*$')     # full-featured "ps" command
else
    CMD=$(ps | grep $PROCNAME | grep -v grep | head -n 1 | grep -o '/.*$')  # "ps" command from BusyBox
fi

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

echo $CMD | cut -d ' ' -f 2-99
0
28.02.2020, 11:47

Теги

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