Зачем 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
вы, следовательно, сопоставляете шаблон с целыми строками, не имея надежного способа привязать этот шаблон к конкретному соответствующему полю,кромеисключив практически все остальное, что может быть полезным и что вы, возможно, пытаетесь найти этим методом в первую очередь.
Например:
- При
u
выборе Linuxps
(который есть-u
в BSDps
) естьuser
поле, содержащее имена пользователей,grep
шаблоны которых при поиске имен программ также иногда будут совпадать. - Каноническая проблема (пример на "В чем разница между ps -ef | grep WDA и ps -ef | grep [W]DA?", "Совпадение названий программ. Почему так много совпадений?", "Функция второго grep в `ps | grep -v | grep`", имногов других местах) конечно же заключается в том, что переданный шаблон
grep
соответствуетgrep
собственному шаблону процессаargs
. - Это может также совпадать со строками окружения, что особенно примечательно, учитывая, что часто можно найти в
_
переменной окружения.
%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
.Руководство по еде. Программное обеспечение.