inits/cmd/dkl-system-init/reaper.go

45 lines
835 B
Go
Raw Normal View History

2018-07-06 08:07:37 +00:00
package main
2018-07-10 06:48:54 +00:00
import (
"fmt"
2018-07-10 06:48:54 +00:00
"os"
"os/signal"
"sync"
2018-07-10 22:40:04 +00:00
"syscall"
2018-07-10 06:48:54 +00:00
"golang.org/x/sys/unix"
"novit.nc/direktil/pkg/log"
)
2018-07-06 08:07:37 +00:00
var reapLock = sync.RWMutex{}
2018-07-06 08:07:37 +00:00
func handleChildren() {
sigchld := make(chan os.Signal, 2048)
signal.Notify(sigchld, syscall.SIGCHLD)
2018-07-10 06:48:54 +00:00
// set us as a sub-reaper
if err := unix.Prctl(unix.PR_SET_CHILD_SUBREAPER, 1, 0, 0, 0); err != nil {
initLog.Taintf(log.Error, "reaper: failed to set myself a child sub-reaper: %v", err)
}
for range sigchld {
2018-07-10 22:40:04 +00:00
reapChildren()
}
}
func reapChildren() {
reapLock.Lock()
defer reapLock.Unlock()
2018-07-10 22:40:04 +00:00
for {
pid, err := syscall.Wait4(-1, nil, syscall.WNOHANG, nil)
if err != nil && err != syscall.ECHILD {
2018-07-10 22:40:04 +00:00
initLog.Taintf(log.Warning, "reaper: wait4 failed: %v", err)
fmt.Printf("reaper: wait4 failed: %v\n", err)
break
2018-07-10 22:40:04 +00:00
}
if pid <= 0 {
break
2018-07-10 06:48:54 +00:00
}
}
2018-07-06 08:07:37 +00:00
}