2009-12-18 12 views

उत्तर

12

आप के साथ मौजूदा प्रक्रिया प्राप्त कर सकते हैं:

Process.pid 

अधिक जानकारी के लिए http://whynotwiki.com/Ruby_/_Process_management देखते हैं।

फिर आप बच्चे के पिड्स प्राप्त करने के लिए ऑपरेटिंग विशिष्ट आदेशों का उपयोग कर सकते हैं। यूनिक्स आधारित सिस्टम पर इस

# Creating 3 child processes. 
IO.popen('uname') 
IO.popen('uname') 
IO.popen('uname') 

# Grabbing the pid. 
pid = Process.pid 

# Get the child pids. 
pipe = IO.popen("ps -ef | grep #{pid}") 

child_pids = pipe.readlines.map do |line| 
    parts = line.split(/\s+/) 
    parts[2] if parts[3] == pid.to_s and parts[2] != pipe.pid.to_s 
end.compact 

# Show the child processes. 
puts child_pids 

की तर्ज मैं स्वीकार करते हैं कि यह शायद सभी यूनिक्स सिस्टम पर काम नहीं करता है के रूप में मेरा मानना ​​है कि ps -ef के उत्पादन में विभिन्न यूनिक्स जायके पर थोड़ा भिन्न होता है के साथ कुछ होगा।

+1

'Process.pid' प्राप्त करने का एक आसान तरीका वर्तमान प्रक्रिया की पिड देता है, न कि मूल प्रक्रिया। अभिभावक प्रक्रिया पिड प्राप्त करने के लिए, 'Process.ppid' करें। – henrikhodne

+0

टिप्पणियों में बस एक त्रुटि हमें वर्तमान प्रक्रिया की आवश्यकता है, क्योंकि यह बाल प्रक्रियाओं का अभिभावक होगा। – Jamie

+5

बस कुछ सेंट: "ps o pid = --ppid # {pid}" "ps -ef | grep # {pid}" से अधिक प्रभावी हो सकता है और आपको इस मामले में अनियंत्रित लाइनों और फ़ील्ड को फ़िल्टर करने की आवश्यकता नहीं होगी । – timurb

6

Process.fork बच्चे के पीआईडी ​​के साथ प्रतिक्रिया करता है। जब आप बच्चों को जन्म देते हैं तो बस उन्हें एक सरणी में ट्रैक रखें। http://ruby-doc.org/core/classes/Process.html#M003148 देखें।

+0

यह एक अच्छा संस्करण होगा लेकिन मेरे मामले में मेरे पास एक ब्लॉक उत्पन्न करने का एक तरीका है और फोर्क काउंटर के माध्यम से उन तरीकों को श्रृंखलाबद्ध करने के लिए फोर्क, सिस्टम, स्पॉन, बैकट्रिक और अन्य सभी कॉलों को ट्रैक करने का एकमात्र तरीका है, लेकिन मुझे उम्मीद थी कि बच्चों की पिड्स – tig

2

भी sys-proctable मणि का उपयोग किया जा सकता है:

require 'sys/proctable' 

Sys::ProcTable.ps.select{ |pe| pe.ppid == $$ } 
0

यह वास्तव में शांत जटिल है और मंच विशिष्ट है। आप वास्तव में सभी उप-प्रक्रियाओं को नहीं ढूंढ सकते हैं अगर वे जानबूझकर छिपाने की कोशिश करते हैं।

यदि आप केवल स्पॉन्ड प्रक्रियाओं को मारना चाहते हैं तो कई विकल्प हैं। एक परीक्षण ढांचे के लिए मैंने दो चुना: 1. pgid => true के साथ स्पॉन प्रक्रियाएं 2. MY_CUSTOM_COOKIE=asjdkahf परिवर्तनीय चर डालें, फिर उस कुकी के साथ प्रोसेस को पर्यावरण में ढूंढें और इसे मार दें।

प्रक्रिया पदानुक्रम को खोजने के लिए ps का उपयोग करके FYI बहुत अविश्वसनीय है। यदि श्रृंखला में एक प्रक्रिया निकलती है, तो इसकी उप-प्रक्रियाओं को 1 (कम से कम लिनक्स पर) का मूल पिड मिलता है। तो यह लागू करने लायक नहीं है।

संबंधित मुद्दे