func (ss *SubService) startProcess() (proc *os.Process, err error) { cmd := exec.Command(ss.binPath, ss.argv...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr dRead, ssWrite, err := os.Pipe() ssRead, dWrite, err := os.Pipe() // Store Fd's for us to read/write to SubService ss.pipe = daemon.NewPipe(dRead, dWrite) // Pass SubService their side of the connection cmd.ExtraFiles = append(cmd.ExtraFiles, ssRead, ssWrite) err = cmd.Start() proc = cmd.Process startupTimer := time.NewTimer(RerunWait) if proc != nil { go ss.watchSignals() go ss.watchProcess(proc, startupTimer) } return }
func (s *Service) serveAdminRequests() { rId := os.Stderr.Fd() + 2 wId := os.Stderr.Fd() + 3 pipeReader := os.NewFile(uintptr(rId), "") pipeWriter := os.NewFile(uintptr(wId), "") s.pipe = daemon.NewPipe(pipeReader, pipeWriter) b := make([]byte, daemon.MAX_PIPE_BYTES) for { n, err := s.pipe.Read(b) if err != nil { if err != io.EOF { log.Printf(log.ERROR, "Error reading from admin pipe "+err.Error()) } else { // We received EOF, ensure we shutdown (if daemon died we could be orphaned) s.Shutdown() } return } cmd := string(b[:n]) log.Println(log.TRACE, "Received "+cmd+" from daemon") switch cmd { case "SHUTDOWN": s.Shutdown() s.pipe.Write([]byte("ACK")) break case "REGISTER": s.Register() s.pipe.Write([]byte("ACK")) case "UNREGISTER": s.Unregister() s.pipe.Write([]byte("ACK")) case "LOG DEBUG", "LOG TRACE", "LOG INFO", "LOG WARN", "LOG ERROR", "LOG FATAL", "LOG PANIC": parts := strings.Split(cmd, " ") log.SetLogLevel(log.LevelFromString(parts[1])) log.Println(log.INFO, "Setting log level to "+parts[1]) s.pipe.Write([]byte("ACK")) } } }