ruby - समस - श्रोणि सूजन बीमारी तस्वीरें




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

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


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

Process.getpgid( pid )

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


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

Process::kill 0, pid

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


*nix - केवल दृष्टिकोण ps लिए शेल-आउट होगा और जांचें कि क्या लौटे स्ट्रिंग में \n (नई पंक्ति) सीमांकक मौजूद है।

उदाहरण आईआरबी आउटपुट

1.9.3p448 :067 > `ps -p 56718`                                                          
"  PID TTY           TIME CMD\n56718 ttys007    0:03.38 zeus slave: default_bundle   \n"

एक विधि के रूप में पैक किया गया

def process?(pid)  
  !!`ps -p #{pid.to_i}`["\n"]
end

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

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

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

उपयोग:

require 'process_exists'

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

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

आप प्रक्रिया को इस्तेमाल कर सकते हैं। अगर आप उस प्रक्रिया की जांच करना चाहते हैं जो आपने स्वयं अर्जित की थी अगर आप 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


यह मेरे लिए काम किया जब मैं जाँच रहा था कि कोई गीत रूबी कोड में खेला जा रहा है

def process_running?(pid)
  return true if pid
  false
end

def play_song_for_real
  @process_id = fork { exec 'afplay', $song_path }
end

यदि आप process_running(@process_id) जांच करते हैं तो आप सही हो जाएगी यदि प्रक्रिया चल रही है या गलत है अगर यह नहीं है







pid