// Package pmuxlib implements the process management aspects of the pmux // process. package pmuxlib import ( "context" "io" "sync" ) type Config struct { TimeFormat string `yaml:"timeFormat"` Processes []ProcessConfig `yaml:"processes"` } // Run runs the given configuration as if this was a real pmux process. It will // block until the context is canceled and all child processes have been cleaned // up. func Run( ctx context.Context, stdout, stderr io.Writer, cfg Config, ) { stdoutLogger := newLogger(stdout, logSepStdout, cfg.TimeFormat) defer stdoutLogger.Close() stderrLogger := newLogger(stderr, logSepStderr, cfg.TimeFormat) defer stderrLogger.Close() sysLogger := stderrLogger.withSep(logSepSys) defer sysLogger.Println("exited gracefully, ciao!") var wg sync.WaitGroup defer wg.Wait() for _, cfgProc := range cfg.Processes { wg.Add(1) go func(procCfg ProcessConfig) { defer wg.Done() stdoutLogger := stdoutLogger.withPName(procCfg.Name) stderrLogger := stderrLogger.withPName(procCfg.Name) sysLogger := sysLogger.withPName(procCfg.Name) sysLogger.Println("starting process") defer sysLogger.Println("stopped process handler") RunProcess( ctx, stdoutLogger, stderrLogger, sysLogger, procCfg, ) }(cfgProc) } }