50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
|
// Package pmuxlib implements the process management aspects of the pmux
|
||
|
// process.
|
||
|
package pmuxlib
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"os"
|
||
|
"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.
|
||
|
func Run(ctx context.Context, cfg Config) {
|
||
|
|
||
|
stdoutLogger := newLogger(os.Stdout, logSepStdout, cfg.TimeFormat)
|
||
|
defer stdoutLogger.Close()
|
||
|
|
||
|
stderrLogger := newLogger(os.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)
|
||
|
}
|
||
|
}
|