2012-02-16 23 views
10

के साथ चल रहे कमांड की पिड कैसे प्राप्त करें मैं इस आदेश की पिड प्राप्त करने का प्रयास कर रहा हूं।सुडो

sudo -b tcpdump -i eth0 port 80 -w eth0.pcap 
+0

नहीं "-ef ps" यह करना होगा:

यहाँ एक उदाहरण रूट के रूप में tcpdump चल रहा है? –

+0

मैं कई tcpdump कमांड चला रहा हूं, इसलिए मैं $ की तरह कुछ करना चाहता हूं! (अंतिम कमांड पिड)। – user87005

+0

'ps aux | grep sudo | tail -n 1' काम नहीं करेगा? – khachik

उत्तर

3

इस उद्देश्य के लिए मैं

sudo gvim &

ps aux | grep gvim

मेरा पीछा उत्पादन

root 11803 0.0 0.0 12064 2776 pts/3 T 12:17 0:00 sudo gvim

केवल हड़पने के लिए के साथ की आपूर्ति में प्रवेश करेंगे पीआईडी ​​मैं

ps aux | awk '/gvim/ {print $2}'

जो एक को मारने के पाइप से वापसी होगी और साथ ही बस

मैं awk से कार्यक्रम को मार सकता है awk का उपयोग करना पसंद

को बाश करने के लिए आदेश

ps aux | awk '/gvim/ {print "sudo kill -9 "$2}' | bash

+0

यदि आपके साथ एक ही समय में चल रही कोई अन्य जीवीआईएम प्रक्रियाएं हैं तो यह आपके अधिक उत्तर देगा। –

+0

हां, जब मैंने इस प्रश्न का उत्तर दिया तो उनके मूल प्रश्न पर उनकी टिप्पणी नहीं लिखी गई थी। मेरे पास अतिरिक्त समय है जब मैं अपना जवाब संशोधित करूंगा। – matchew

7

आप $! उपयोग कर सकते हैं पिछले पृष्ठभूमि प्रक्रिया की पीआईडी ​​(जो इस मामले में sudo हो जाएगा) प्राप्त करने के लिए, और ps --ppid अपने बच्चों के बारे में पता लगाने के लिए। उदाहरण के लिए:

$ sudo tcpdump -i eth0 port 80 -w eth0.pcap & 
$ ps --ppid $! -o pid= 
16772 
$ ps --pid 16772 
    PID TTY   TIME CMD 
16772 pts/3 00:00:00 tcpdump 

आप एक स्क्रिप्ट में इस कर रहे हैं, तो आप एक sudops के बीच और sleep 1 का उपयोग करने के लिए सुनिश्चित करें कि बच्चा प्रारंभ कर सकते हैं।

ध्यान दें कि यदि आपको वास्तव में -b ध्वज को सूडो में उपयोग करना चाहिए, तो यह काम नहीं करेगा, क्योंकि इससे सूडो को अतिरिक्त कांटा करने और तुरंत बाहर निकलने का कारण होगा, बच्चे और माता-पिता के बीच कनेक्शन खोना होगा (tcpdump कमांड प्राप्त होगा init के लिए reparented), जिसका मतलब है कि बच्चे को किसी अन्य समान आदेश से अलग करने का कोई आसान तरीका नहीं होगा।

0

-ops विकल्प आपको चुनने के लिए कि कौन से फ़ील्ड प्रदर्शित करना है। उन क्षेत्रों में, आप संचयी सीपीयू समय (cputime), विलुप्त समय (etime) जैसी चीजें दिखा सकते हैं, और समय शुरू कर सकते हैं (lstart)। आप --sort का उपयोग कर एक फ़ील्ड को भी क्रमबद्ध कर सकते हैं। तो आपके लिए एक समाधान हो सकता है:

ps -eo pid,command,lstart --sort lstart | grep 'sudo -b tcpdump' | tail -1 

तुम भी क्षेत्र के द्वारा आप क्रमबद्ध करना चाहते हैं प्रदर्शित करने के लिए ps बताने की आवश्यकता नहीं है। अधिक जानकारी के लिए man ps

sudo -u username sh -c "echo \$\$ > /tmp/my_pid/file; exec my_command" & 

यहाँ अन्य उत्तर ps उत्पादन grepping पर भरोसा करते हैं:

5

यहाँ एक तरह से यह करने के लिए है। यदि एकाधिक tcpdump आदेश चल रहे हैं, तो आप गलती से गलत पिड grep कर सकते हैं। यह वास्तविक पिड प्राप्त करता है और इसे एक फाइल में रखता है।

$ sudo -u root sh -c "echo \$\$ > /tmp/tcpdump.pid; exec tcpdump -i en3 -w eth0.pcap" & 
[1] 37201 
tcpdump: listening on en3, link-type EN10MB (Ethernet), capture size 65535 bytes 
$ sudo kill `cat /tmp/tcpdump.pid` 
6212 packets captured 
6243 packets received by filter 
0 packets dropped by kernel 
[1]+ Done     sudo -u root sh -c "echo \$\$ > /tmp/tcpdump.pid; exec tcpdump -i en3 -w eth0.pcap" 
$ 
संबंधित मुद्दे