Ps'de birkaç koşulla seçim yapmanın bir yolu var mı?


12

Körü körüne açık bir şey eksik görünüyor, ama yine de:

ps -f -u myuser --ppid 1

Sürecin yalnızca üst pid'ine bir göz atmak gibi görünüyor ve kullanıcı pid'i 1 olduğunda üst pid'i olan tüm işlemleri döndürüyor myuser.

-uTek başına işler doğru (sadece işler seçilmesi myuser):

ps -f -u myuser

Neyi kaçırıyorum? Çeşitli koşullara göre filtrelemenin yerleşik bir yolu var mı ps?

EDIT: Geçerli geçici çözümüm:

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

Yanıtlar:


12

psbu şekilde sinir bozucu. Neyse ki, pgrepbenzer seçim seçeneklerine sahip, ancak hepsinin eşleşmesini ve ardından eşleşen pideleri çıkarmasını gerektirir. Varsayılan olarak, her satıra bir çıktı verir, ancak farklı bir sınırlayıcı kullanması istenebilir, böylece aşağıdakilerle çalışır ps:

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

4

Ne yazık ki pssadece seçimini kaldırabilir, bir andoperatör veya ayrıntılandırma ekleme yeteneği yok gibi görünüyor .

pgrepPID'lerin bir listesini almak ve bunu beslemek için yardım alabilirsiniz ps. Örneğin:

$ 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çok esnek filtreleri yoktur. İhtiyacınız olandan daha fazlasını görüntülemesini sağlayın, biçimi açıkça belirtin ve çıktıyı filtreleyin. Awk genellikle bu görev için iyi çalışır.

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

Sütun adlarından sonraki eşit işaretler başlık satırını bastırır. Başlık çizgilerini görmek istiyorsanız, filtrenin ilk satırı yazdırmadan değiştirmesini sağlayın:

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

Bazı otomatik işlemler yapmak istiyorsanız, verileri yalnızca PID'lere ayırmanız gerekir.

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

0

Benim toplu iş tarafından başlatılan PID kontrol etmek zorunda kaldı, bu yüzden bir PID ve bir PPID kontrol etmek zorunda kaldı, bu grep bana daha yararlı oldu:

grep -c $$ /proc/CHILDPID/stat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.