Я хочу видеть список процессов, похожих на то, что выводит ps aux, но не показывать какие-либо root процессы.

2
Joshua Huber 16 Дек 2021 в 21:36

3 ответа

ps u $(pgrep -vu root)

Объяснение

  • pgrep - для поиска процессов, возвращая их числовые PID
  • -v - инверсия фильтра
  • -u root - фильтровать процессы, принадлежащие пользователю root
  • $(…) - замена
  • ps u … - показать список процессов

Обновление: Исходное решение практически эквивалентно другому, приведенному ниже, только использует xargs вместо $(…):

pgrep -vu root | xargs ps u
3
Joshua Huber 17 Дек 2021 в 01:23
+1 (при условии, что $IFS содержит значение по умолчанию). Или ps aux | awk '$1 != "root"' (при условии, что имена пользователей не содержат пробелов).
 – 
Stéphane Chazelas
16 Дек 2021 в 22:44

Это работает в Fedora 35 (ps из procps-ng 3.3.17):

ps u -N -u root

Лично я всегда использую флаг f. Облегчает чтение вывода: ps fu -N -u root

1
Artem S. Tashkinov 17 Дек 2021 в 03:11

Это работает в моих системах Debian и в моей macOS 10.15. Это может быть немного излишним для этого требования, но оно достаточно адаптируется к другим требованиям:

ps -eo pid,stat,ruser,command | awk '{ if ($3 != "root") print $0;}'
  PID STAT RUSER    COMMAND
  312 Ssl  systemd+ /lib/systemd/systemd-timesyncd
  349 Ss   avahi    avahi-daemon: running [raspberrypi4b.local]
  359 Ss   nobody   /usr/sbin/thd --triggers /etc/triggerhappy/triggers.d/ --socket /run/thd.socket --user nobody --deviceglob /dev/input/event*
  365 Ss   message+ /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
  393 S    avahi    avahi-daemon: chroot helper
  620 Ss   vnstat   /usr/sbin/vnstatd -n
  910 Ss   Debian-+ /usr/sbin/exim4 -bd -q30m
 2193 R+   pi       ps -eo pid,stat,ruser,command
 2194 S+   pi       awk { if ($3 != "root") print $0;}

# alternatively, for a more compact output: 

ps -eo pid,ruser | awk '{ if ($2 != "root") print $0;}'
  PID RUSER
  312 systemd-timesync
  349 avahi
  359 nobody
  365 messagebus
  393 avahi
  620 vnstat
  910 Debian-exim
 2204 pi
 2205 pi

примечание: приведенные выше списки не являются полными; исключено для краткости

Резюме:

ps -e показывает каждый процесс в системе с использованием стандартного синтаксиса (aux – это синтаксис BSD)

ps -eo параметр -o – один из нескольких, перечисленных в разделе OUTPUT FORMAT CONTROL документа man ps, которые можно использовать для выбора информации, отображаемой man ps. ps. Зачем загромождать вывод вещами, которые вам не нужны? Если вам нужно все, ps -e — это все, что вам нужно.

ps -eo pid,stat,ruser,command параметр -o позволяет выбирать выходные параметры с помощью одного или нескольких ключевых слов, перечисленных в man ps под STANDARD FORMAT SPECIFIERS раздел. В этом примере ps перечисляет все PID, состояния процессов, реальные идентификаторы пользователей и command, которые их породили. Еще раз см. полный список ключевых слов в разделе STANDARD FORMAT SPECIFIERS man ps.

Канал к awk просто фильтрует все пользовательские процессы root и, конечно же, легко модифицируется для фильтрации по другим полям в выводе ps.

1
Seamus 20 Дек 2021 в 21:23
1
grep -v root отфильтрует некоторые дополнительные процессы, если они содержат строку root. Например, пользователь без полномочий root, работающий с /usr/bin/frootyloops, будет отфильтрован. Аналогичная проблема с grep -v grep. Если пользователь без полномочий root запускает дорогостоящий grep, такой как grep -rl foo /, фильтр скроет такой процесс.
 – 
Joshua Huber
20 Дек 2021 в 16:13
@JoshuaHuber: Да, будет; awk будет лучшим решением, чем grep.
 – 
Seamus
20 Дек 2021 в 20:37