@@ -77,25 +77,59 @@ var initCmd = &cobra.Command{
7777 }
7878
7979 supervisorDone := make (chan struct {})
80+ handledByReaper := make (chan int )
81+ handleSupervisorExit := func (exitCode int ) {
82+ if exitCode == 0 {
83+ return
84+ }
85+ logs := extractFailureFromRun ()
86+ if shared .IsExpectedShutdown (exitCode ) {
87+ log .Fatal (logs )
88+ } else {
89+ log .WithError (fmt .Errorf (logs )).Fatal ("supervisor run error with unexpected exit code" )
90+ }
91+ }
8092 go func () {
8193 defer close (supervisorDone )
8294
8395 err := runCommand .Wait ()
84- if err != nil && ! (strings .Contains (err .Error (), "signal: " ) || strings .Contains (err .Error (), "no child processes" )) {
96+ if err == nil {
97+ return
98+ }
99+ // exited by reaper
100+ if strings .Contains (err .Error (), "no child processes" ) {
101+ ctx , cancel := context .WithTimeout (context .Background (), time .Second * 5 )
102+ defer cancel ()
103+ select {
104+ case <- ctx .Done (): // timeout
105+ case exitCode := <- handledByReaper :
106+ handleSupervisorExit (exitCode )
107+ }
108+ } else if ! (strings .Contains (err .Error (), "signal: " )) {
85109 if eerr , ok := err .(* exec.ExitError ); ok && eerr .ExitCode () != 0 {
86- logs := extractFailureFromRun ()
87- if shared .IsExpectedShutdown (eerr .ExitCode ()) {
88- log .Fatal (logs )
89- } else {
90- log .WithError (fmt .Errorf (logs )).Fatal ("supervisor run error with unexpected exit code" )
91- }
110+ handleSupervisorExit (eerr .ExitCode ())
92111 }
93112 log .WithError (err ).Error ("supervisor run error" )
94113 return
95114 }
96115 }()
97116 // start the reaper to clean up zombie processes
98- reaper .Reap ()
117+ reaperChan := make (chan reaper.Status , 10 )
118+ reaper .Start (reaper.Config {
119+ Pid : - 1 ,
120+ Options : 0 ,
121+ DisablePid1Check : false ,
122+ StatusChannel : reaperChan ,
123+ })
124+ go func () {
125+ for status := range reaperChan {
126+ if status .Pid != runCommand .Process .Pid {
127+ continue
128+ }
129+ exitCode := status .WaitStatus .ExitStatus ()
130+ handledByReaper <- exitCode
131+ }
132+ }()
99133
100134 select {
101135 case <- supervisorDone :
0 commit comments