मेरा गोलांग कार्यक्रम एक सेवा कार्यक्रम शुरू करता है जिसे हमेशा के लिए चलाना चाहिए, जैसे:

cmd := exec.Command("/path/to/service")
cmd.Start()

मैं "सेवा" की समाप्ति की प्रतीक्षा नहीं करना चाहता क्योंकि इसे हमेशा के लिए चलना चाहिए। हालांकि, अगर सेवा कुछ त्रुटि से शुरू होती है (उदाहरण के लिए यदि कोई अन्य उदाहरण पहले से चल रहा है तो यह समाप्त हो जाएगा), बाल प्रक्रिया बाहर निकल जाएगी और ज़ोंबी बन जाएगी।

मेरा सवाल है, cmd.Start() के बाद, क्या मैं किसी तरह यह पता लगा सकता हूं कि क्या बच्चा प्रक्रिया अभी भी चल रही है, बजाय एक ज़ोंबी बनने के? पसंदीदा तरीका हो सकता है:

if cmd.Process.IsZombie() {
    ... ...
}

या,

procStat := cmd.GetProcessStatus()
if procStat.Zombie == true {
    ... ...
}

यानी मुझे उम्मीद है कि इसके निकास कोड की प्रतीक्षा किए बिना (बच्चे) प्रक्रिया की स्थिति प्राप्त करने का कोई तरीका है, या अवरुद्ध किए बिना इसके स्थिति कोड को "झांकना" है।

धन्यवाद!

0
xrfang 22 सितंबर 2017, 18:03

2 जवाब

सबसे बढ़िया उत्तर

सबसे अच्छा समाधान (मेरे लिए) है:

  1. सिग्नल हैंडलर जोड़ें SIGCHLD के लिए सुनें
  2. SIGCHLD प्राप्त करने पर, cmd पर कॉल करें। प्रतीक्षा करें ()

इस तरह, ज़ोंबी प्रक्रिया गायब हो जाएगी।

1
xrfang 12 अक्टूबर 2017, 05:58

दस्तावेज़ों से निर्णय लेना प्रक्रिया स्थिति प्राप्त करने का एकमात्र तरीका 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
}
4
Peter 22 सितंबर 2017, 18:30