वहाँ `ps` में कई शर्तों द्वारा चयन करने के लिए एक रास्ता है?


12

ऐसा लगता है कि मैं कुछ स्पष्ट स्पष्ट याद कर रहा हूँ, लेकिन अभी भी:

ps -f -u myuser --ppid 1

केवल प्रक्रिया के मूल जनक पर एक नज़र रखना चाहता है, और उन सभी प्रक्रियाओं को लौटाता है जिनमें 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पीआईडी ​​की एक सूची प्राप्त करने के लिए सहायता प्राप्त कर सकते हैं और 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बहुत लचीला फिल्टर नहीं है। इसे अपनी आवश्यकता से अधिक प्रदर्शित करें, प्रारूप को स्पष्ट रूप से निर्दिष्ट करें, और आउटपुट को फ़िल्टर करें। इस कार्य के लिए अक्क अक्सर अच्छा काम करेगा।

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)'

यदि आप कुछ स्वचालित प्रसंस्करण करना चाहते हैं, तो आपको डेटा को केवल पीआईडी ​​में नीचे करना होगा।

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

0

मुझे अपने बैच द्वारा पीआईडी ​​की शुरुआत के लिए जांच करनी थी, इसलिए मुझे पीआईडी ​​और पीपीआईडी ​​की जांच करनी थी, यह ग्रीप मेरे लिए अधिक उपयोगी था:

grep -c $$ /proc/CHILDPID/stat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.