ruby समस मैं रूबी से कैसे जांच सकता हूं कि एक निश्चित पीआईडी ​​के साथ एक प्रक्रिया चल रही है?




श्रोणि सूजन बीमारी तस्वीरें (8)

यदि एक से अधिक मार्ग हैं, तो उन्हें सूचीबद्ध करें। मैं केवल एक के बारे में जानता हूं, लेकिन मैं सोच रहा हूँ कि क्या एक क्लीनर, इन-रूबी के रास्ते हैं


यदि यह एक ऐसी प्रक्रिया है जिसे आप "खुद" की अपेक्षा करते हैं (उदाहरण के लिए आप इसे नियंत्रित करने वाली प्रक्रिया के लिए एक पीड को मान्य करने के लिए इसका उपयोग कर रहे हैं), तो आप इसे सिग 0 भेज सकते हैं।

>> Process.kill 0, 370
=> 1
>> Process.kill 0, 2
Errno::ESRCH: No such process
    from (irb):5:in `kill'
    from (irb):5
>> 

मैंने इस समस्या से पहले और कल निपटाया है, मैंने इसे " प्रोसेस_एक्सिस्ट्स " मणि में संकलित किया है।

यह शून्य सिग्नल (0) को प्रक्रिया में भेजता है ताकि यह जांच सके कि यह मौजूद है या नहीं। यह तब भी काम करता है जब वर्तमान उपयोगकर्ता को प्राप्त करने की प्रक्रिया के लिए संकेत भेजने की अनुमति नहीं है।

उपयोग:

require 'process_exists'

pid = 12
pid_exists = Process.exists?(pid)

ऐसा मैं कैसे कर रहा हूं:

def alive?(pid)
  !!Process.kill(0, pid) rescue false
end

लिनक्स के अंतर्गत आप proc फाइलसिस्टम का उपयोग कर चलने वाले प्रोग्राम के बहुत सारे गुण प्राप्त कर सकते हैं:

File.read("/proc/#{pid}/cmdline")
File.read("/proc/#{pid}/comm")

बाल प्रक्रियाओं के लिए, अन्य समाधान जैसे संकेत भेजना अपेक्षित नहीं होगा: वे यह संकेत देंगे कि वास्तव में बाहर निकल जाने पर यह प्रक्रिया अभी भी चल रही है।

आप प्रक्रिया को इस्तेमाल कर सकते हैं। अगर आप उस प्रक्रिया की जांच करना चाहते हैं जो आपने स्वयं अर्जित की थी अगर आप Process::WNOHANG ध्वज का उपयोग कर रहे हैं तो कॉल को ब्लॉक नहीं होगा और जब तक बाल प्रक्रिया नहीं निकलती तब तक वापस नहीं लौटा जा रहा है।

उदाहरण:

pid = Process.spawn('sleep 5')
Process.waitpid(pid, Process::WNOHANG) # => nil
sleep 5
Process.waitpid(pid, Process::WNOHANG) # => pid

यदि pid किसी बच्चे की प्रक्रिया से संबंधित नहीं है, तो एक अपवाद फेंक दिया जाएगा ( Errno::ECHILD: No child processes )।

वही प्रक्रिया के लिए लागू होता है। Waitpid2


Process.getpgid और Process::kill बीच का अंतर Process::kill दृष्टिकोण को लगता है कि क्या होता है जब pid मौजूद होता है लेकिन किसी अन्य उपयोगकर्ता के स्वामित्व में है Process.getpgid एक उत्तर वापस करेगा, Process::kill एक अपवाद फेंक देगा (Errno::EPERM)

इसके आधार पर, मैं प्रक्रिया की सलाह देता हूं Process.getpgid , यदि केवल कारण के लिए कि यह आपको दो अलग-अलग अपवादों को पकड़ने के लिए बचाता है

यहां कोड का उपयोग किया गया है I

begin
  Process.getpgid( pid )
  true
rescue Errno::ESRCH
  false
end

@ जॉन टी, @ डस्टिन: वास्तव में, दोस्तों, मैंने प्रक्रिया आरडीओक्स का इस्तेमाल किया, और ऐसा दिखता है

Process.getpgid( pid )

उसी तकनीक को लागू करने के लिए एक कम हिंसक साधन है।


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

Process::kill 0, pid

जहां pid pid संख्या है, अगर pid चल रहा है, यह 1 को वापस करना चाहिए





pid