Чи є спосіб вибору декількома умовами в `ps`?


12

Здається, я пропускаю щось сліпуче очевидне, але все-таки:

ps -f -u myuser --ppid 1

Здається, лише подивіться на батьківський pid процесу та повертає всі процеси, у яких батьківський pid 1 - навіть тоді, коли користувача немає myuser.

У -uпоодинці працює правильно (вибір тільки процеси myuser):

ps -f -u myuser

Що я пропускаю? Чи існує якийсь вбудований спосіб фільтрації за кількома умовами ps?

EDIT: Мій поточний спосіб вирішення:

ps -f -p $(join <(ps h --ppid 1 -o pid | sort) <(ps h -u myuser -o pid | sort))

Відповіді:


12

psдратує такий спосіб. На щастя, є такий pgrep, який має подібні параметри вибору, але вимагає, щоб усі вони відповідали, а потім виводили відповідні піди. За замовчуванням він виводить один на рядок, але його можна попросити використовувати інший роздільник, щоб він працював із ps:

ps -f -p"$(pgrep -d, -u $USER -P 1)"

4

На жаль, psможна лише скасувати вибір, не здається ні andоператора, ні можливості додати уточнення.

Ви можете заручитися допомогою, pgrepщоб отримати список PID-кодів і подати їх до цього ps. Наприклад:

$ ps -f $(pgrep -P 1 -u saml)
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
saml      1986     1  0 Jul25 ?        SLl    0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
saml      2003     1  0 Jul25 ?        S      0:00 dbus-launch --sh-syntax --exit-with-session
saml      2004     1  0 Jul25 ?        Ss     0:23 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
saml      2147     1  0 Jul25 ?        S      0:04 /usr/libexec/gconfd-2
saml      2156     1  0 Jul25 ?        Ssl    0:09 /usr/libexec/gnome-settings-daemon
saml      2162     1  0 Jul25 ?        S      0:00 /usr/libexec/gvfsd
saml      2178     1  0 Jul25 ?        Ssl    0:01 /usr/bin/pulseaudio --start --log-target=syslog
saml      2180     1  0 Jul25 ?        Ssl    0:04 /usr/libexec//gvfs-fuse-daemon /home/saml/.gvfs
saml      2191     1  0 Jul25 ?        S      0:12 syndaemon -i 0.5 -k
saml      2193     1  0 Jul25 ?        S      0:00 /usr/libexec/gvfs-gdu-volume-monitor

2

psне має дуже гнучких фільтрів. Зробіть так, щоб він відображався більше, ніж потрібно, чітко вкажіть формат і відфільтруйте вихід. Awk часто справляється з цим завданням.

ps -o pid= -o ppid= -o user= -o comm= -o args= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid'

Знаки рівності після назв стовпців придушують рядок заголовка. Якщо ви хочете побачити рядки заголовка, змусьте фільтр роздрукувати перший рядок без змін:

ps -o pid -o ppid -o user -o comm -o args |
awk -v uid="$(id -un myuser)" 'NR == 1 || ($2 == 1 && $3 == uid)'

Якщо ви хочете виконати автоматизовану обробку, вам потрібно знімати дані лише до PID.

ps -o pid= -o ppid= -o user= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid {print $1}'

0

Мені довелося перевірити наявність PID, розпочату моєю партією, тому мені довелося перевірити PID та PPID, ця грепа для мене була більш корисною:

grep -c $$ /proc/CHILDPID/stat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.