дальнейшее чтение

дальнейшее чтение

Зачем pgrepнужно? Если мы можем использовать psи grepвместе, зачем нам нужно pgrep? Было бы странно, если бы у нас была команда lsgrepили curlgrep.

Но я заметил одно отличие: если мы сначала запустим сеанс tmux с

tmux new -s foo

затем

ps aux | grep tmux

не сможет найти процесс сервера tmux, но

pgrep -l tmux

может. Но все же, почему у нас нет флага с, psчтобы мы могли, grepнапример, pgrepвидеть процесс сервера tmux? В чем разница между psс grepи pgrep?

решение1

Команда psимеет два поля, которые, как правило, ищутся таким образом, argsи comm. Первое — это строка аргумента программы, разделенная NUL. Второе — это «имя» программы. Они хранятся отдельно и (в различных операционных системах) могутобабыть изменены самой программой во время выполнения. Такие программы tmuxдействительно это делают.

Выходной сигнал — psэтоне поддается машинному анализу. Несколько полей могут содержатьнезакодированные пробелычто делает невозможным надежное определение границ полей, поскольку пробелы произвольной длинытакжеразделитель полей. argsи commдействительно два таких поля. Вывод psдоступен только для чтения человеком.

Когда вы grepвыводите, psвы, следовательно, сопоставляете шаблон с целыми строками, не имея надежного способа привязать этот шаблон к конкретному соответствующему полю,кромеисключив практически все остальное, что может быть полезным и что вы, возможно, пытаетесь найти этим методом в первую очередь.

Например:

%ps -a -x -e -o sid,comm,args |
  grep dbus-демон |
  голова -н 4
   25 нош циклог dbus-daemon/ (нош)
   25 dbus-daemon dbus-daemon --config-file ./system-wide.conf --nofork --address=unix:path=/run/dbus/system_bus_socket
  989 dbus-daemon dbus-daemon --config-file ./per-user.conf --nofork --address=unix:path=/run/user/JdeBP/bus
15107 grep grep dbus-daemon
%
%clearenv --keep-path \
  setenv WIBBLE tmux \
  ps -a -x -e -o sid,comm,команда |
  grep tmux
15107 ps PATH=/usr/local/bin:/usr/bin:/bin WIBBLE=tmux ps -a -x -e -o sid,pid,comm,command
%

Другими словами: grepдля работы с текстовыми файлами, содержащими строки. Таблица процессов не является текстовым файлом, и обращение с ней как с текстовым файлом (путем перевода с помощью команды ps) приводит к потере информации о полях.

Способом выполнения такого поиска является просмотр таблицы процессов с помощью чего-то иного, чем ps. В Linux можно напрямую просмотреть /proc/${PID}/commи аналогичные псевдофайлы для строк аргументов, строк окружения и т. д.

Или можно написать инструмент, который вылавливаетконкретные данные для сопоставленияиз таблицы процессов, и это запускает шаблонную обработку только на этом поле. Этот инструмент не для текстовых файлов, а для таблиц процессов. Его можно назвать pgrep.

Конечно, на сжимающей руке можно было бы написать, psчей выход одинможетпроцесс с (скажем) awk, потому что этоявляетсямашиночитаемый, кодирующий пробелы vis()и таким образом предоставляющий поля, которые awkмогут правильно распознавать. Недостаток в том, что тогда он менеечеловекps-читабельно и не совсем то, что должно быть конформным . Я передаю его вывод console-flat-table-viewer, чтобы прочитать его. ☺

%system-control ps -p 740 -o sid,comm,args
КОМАНДА SID КОМАНДА
25 dbus-daemon dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket'
%
%system-control ps -A -o sid,comm,args,env,tree |
  awk '{ if ("dbus-daemon"==$2) print $3; }'
dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket'
dbus-daemon\040--config-file\040./per-user.conf\040--nofork\040'--address=unix:path=/run/user/JdeBP/bus'
/usr/local/bin/dbus-daemon\040--fork\040--print-pid\0405\040--print-address\0407\040--session
%
%system-control ps -A -o sid,comm,args,env,tree |
  awk '{ if ("dbus-daemon"==$2) print $3; }' |
  невидно
dbus-daemon --config-file ./system-wide.conf --nofork '--address=unix:path=/run/dbus/system_bus_socket'
dbus-daemon --config-file ./per-user.conf --nofork '--address=unix:path=/run/user/JdeBP/bus'
/usr/local/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
%

дальнейшее чтение

  • ps.Руководство по основным командам NetBSD. 2016-12-02.
  • vis.Руководство по функциям библиотеки NetBSD. 2017-04-22.
  • Шломи Ноах (01.10.2009). Как НЕ проверять работоспособность mysqld. code.openark.org.
  • Грег Вуледж. «Риск разбора дерева процессов».Управление процессом. Википедия Грега.
  • Джонатан де Бойн Поллард (2015).clearenv.Руководство по еде. Программное обеспечение.
  • Джонатан де Бойн Поллард (2015).setenv.Руководство по еде. Программное обеспечение.
  • Джонатан де Бойн Поллард (2020).ps.Руководство по еде. Программное обеспечение.
  • Джонатан де Бойн Поллард (2020).list-process-table.Руководство по еде. Программное обеспечение.

Связанный контент