В чем разница между pgrep и `ps aux | grep `?

Это может быть устаревший вопрос, но, если у кого-то возникла аналогичная проблема, я бы рекомендовал проверить сообщения об ошибках Xid на веб-сайте Nvidia, по этой ссылке

Например, вы можете видеть, что ошибки № 13 и 31 связаны с пользовательским приложением. Это может быть используемое вами программное обеспечение, которое неправильно обрабатывает использование или доступ к памяти.

-2
08.04.2020, 19:49
1 ответ

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

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

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

Для примера:

% ps -a -x -e -o sid,comm,args |
  grep dbus-daemon |
  head -n 4
   25 nosh                cyclog dbus-daemon/ (nosh)
   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,command |
  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, чтобы прочитать его. & #9786;

% system-control ps -p 740 -o sid,comm,args
SID COMMAND COMMAND
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,envs,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,envs,tree |
  awk '{ if ("dbus-daemon"==$2) print $3; }' |
  unvis
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.
  • Шломи Ноах (2009 -10 -01 ).Как НЕ проверять работоспособность mysqld. code.openark.org.
  • Грег Вуледж. «Риск разбора дерева процессов» . Управление процессами . Вики Грега.
  • Джонатан де Бойн Поллард (2015 ).clearenv. Направляющая ноша . Программное обеспечение.
  • Джонатан де Бойн Поллард (2015 ).setenv.Направляющая ноша . Программное обеспечение.
  • Джонатан де Бойн Поллард (2020 ).ps. Направляющая ноша . Программное обеспечение.
  • Джонатан де Бойн Поллард (2020 ).list-process-table. Направляющая ноша . Программное обеспечение.
2
28.04.2021, 23:18

Теги

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