मेरा गोलांग कार्यक्रम एक सेवा कार्यक्रम शुरू करता है जिसे हमेशा के लिए चलाना चाहिए, जैसे:
cmd := exec.Command("/path/to/service")
cmd.Start()
मैं "सेवा" की समाप्ति की प्रतीक्षा नहीं करना चाहता क्योंकि इसे हमेशा के लिए चलना चाहिए। हालांकि, अगर सेवा कुछ त्रुटि से शुरू होती है (उदाहरण के लिए यदि कोई अन्य उदाहरण पहले से चल रहा है तो यह समाप्त हो जाएगा), बाल प्रक्रिया बाहर निकल जाएगी और ज़ोंबी बन जाएगी।
मेरा सवाल है, cmd.Start() के बाद, क्या मैं किसी तरह यह पता लगा सकता हूं कि क्या बच्चा प्रक्रिया अभी भी चल रही है, बजाय एक ज़ोंबी बनने के? पसंदीदा तरीका हो सकता है:
if cmd.Process.IsZombie() {
... ...
}
या,
procStat := cmd.GetProcessStatus()
if procStat.Zombie == true {
... ...
}
यानी मुझे उम्मीद है कि इसके निकास कोड की प्रतीक्षा किए बिना (बच्चे) प्रक्रिया की स्थिति प्राप्त करने का कोई तरीका है, या अवरुद्ध किए बिना इसके स्थिति कोड को "झांकना" है।
धन्यवाद!
2 जवाब
सबसे अच्छा समाधान (मेरे लिए) है:
- सिग्नल हैंडलर जोड़ें SIGCHLD के लिए सुनें
- SIGCHLD प्राप्त करने पर, cmd पर कॉल करें। प्रतीक्षा करें ()
इस तरह, ज़ोंबी प्रक्रिया गायब हो जाएगी।
दस्तावेज़ों से निर्णय लेना प्रक्रिया स्थिति प्राप्त करने का एकमात्र तरीका os.Process.Rout को कॉल करना है। तो ऐसा लगता है कि आपको गोरोइन में प्रतीक्षा को कॉल करना होगा, और फिर आप आसानी से जांच सकते हैं कि क्या गोरोइन अभी तक बाहर निकल गया है:
var cmd exec.Cmd
done := make(chan error, 1)
go func() {
done <- cmd.Wait()
}()
select {
case err := <-done:
// inspect err to check if service exited normally
default:
// not done yet
}
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
go
गो एक ओपन-सोर्स प्रोग्रामिंग भाषा है। यह स्वत: मेमोरी प्रबंधन, प्रकार सुरक्षा, कुछ गतिशील टाइपिंग क्षमताओं, अतिरिक्त अंतर्निहित प्रकार जैसे चर-लंबाई सरणियों (स्लाइस कहा जाता है) और कुंजी-मान मानचित्रों को जोड़ने के लिए, सी से व्युत्पन्न एक वाक्यविन्यास के साथ सांख्यिकीय रूप से टाइप किया जाता है, और बड़े मानक पुस्तकालय।