มีวิธีให้เลือกหลายเงื่อนไขใน `ps` หรือไม่?


12

ดูเหมือนว่าฉันขาดอะไรบางอย่างที่เห็นได้ชัด แต่ยัง:

ps -f -u myuser --ppid 1

ดูเหมือนว่าจะใช้เวลาเพียงดูที่ pid แม่ของกระบวนการและผลตอบแทนทุกกระบวนการที่มี pid แม่ของ 1 - myuserแม้ในขณะที่ผู้ใช้ไม่ได้

-uงานคนเดียวได้อย่างถูกต้อง (เลือกเฉพาะกระบวนการของการmyuser):

ps -f -u myuser

ฉันกำลังคิดถึงอะไร มีบางตัวในทางที่จะกรองตามเงื่อนไขในหลาย ๆps?

แก้ไข: วิธีแก้ปัญหาปัจจุบันของฉัน:

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 นี้มีประโยชน์มากกว่าสำหรับฉัน:

grep -c $$ /proc/CHILDPID/stat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.