Apakah ada cara untuk memilih beberapa kondisi di `ps`?

12

Sepertinya saya kehilangan sesuatu yang sangat jelas, tapi tetap saja:

ps -f -u myuser --ppid 1

Tampaknya hanya melihat pid induk dari proses, dan mengembalikan semua proses yang memiliki pid induk 1 - bahkan ketika pengguna tidak myuser.

Satu- -usatunya yang bekerja dengan benar (hanya memilih proses myuser):

ps -f -u myuser

Apa yang saya lewatkan? Apakah ada beberapa cara untuk menyaring berdasarkan beberapa kondisi ps?

EDIT: Solusi saya saat ini:

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

Jawaban:

12

psmenjengkelkan seperti itu. Untungnya, ada pgrep, yang memiliki opsi pemilihan yang serupa, tetapi mengharuskan mereka semua untuk mencocokkan dan kemudian mengeluarkan hasil yang cocok. Secara default itu menghasilkan satu per baris, tetapi dapat diminta untuk menggunakan pembatas yang berbeda sehingga akan bekerja dengan ps:

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

Sayangnya pshanya dapat membatalkan pilihan, tampaknya tidak ada andoperator atau kemampuan untuk menambahkan penyempurnaan.

Anda dapat meminta bantuan pgrepuntuk mendapatkan daftar PID dan mengirimkannya ke ps. Sebagai contoh:

$ 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
slm
sumber
2

pstidak memiliki filter yang sangat fleksibel. Buat tampilan lebih dari yang Anda butuhkan, tentukan formatnya secara eksplisit, dan filter hasilnya. Awk akan sering bekerja dengan baik untuk tugas ini.

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

Tanda sama dengan setelah nama kolom menekan baris header. Jika Anda ingin melihat baris tajuk, buat filter untuk mencetak baris pertama tidak berubah:

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

Jika Anda ingin melakukan pemrosesan otomatis, Anda harus menghapus data hanya ke PID.

ps -o pid= -o ppid= -o user= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid {print $1}'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
0

Saya harus memeriksa PID yang dimulai oleh batch saya, jadi saya harus memeriksa PID dan PPID, grep ini lebih berguna bagi saya:

grep -c $$ /proc/CHILDPID/stat
Ragnarok
sumber