https://github.com/shima-park/subproc
https://github.com/shima-park/subproc
child-process golang sub-process
Last synced: 29 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/shima-park/subproc
- Owner: shima-park
- Created: 2020-07-17T11:23:06.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2020-08-09T14:46:59.000Z (over 5 years ago)
- Last Synced: 2024-06-20T16:46:34.458Z (over 1 year ago)
- Topics: child-process, golang, sub-process
- Language: Go
- Homepage:
- Size: 10.7 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# subproc
subproc Library for Sub-process scheduling management, based on [docker reexec](https://github.com/moby/moby/blob/master/pkg/reexec/reexec.go)
# feature
* Basically run, view, wait, and stop management of Sub-processes
# example
``` golang
func init() {
subproc.Register("hello", hello)
subproc.Register("mockPanic", mockPanic)
subproc.Register("mockError", mockError)
subproc.Register("mockSucc", mockSucc)
if subproc.Init() {
os.Exit(0)
}
}
func hello() {
for {
fmt.Println(time.Now(), "hello world")
time.Sleep(time.Second)
}
}
func mockPanic() {
panic("mock panic")
}
func mockError() {
subproc.FailCmd(errors.New("mock error"))
}
func mockSucc() {
subproc.SuccCmd("Hello world")
}
func printProcs(m subproc.SubProcManager) {
go func() {
for {
fmt.Println(strings.Repeat("=", 20), "begin", strings.Repeat("=", 20))
for cmd, procs := range m.List(subproc.WithMatchAll()) {
for _, p := range procs {
fmt.Println(
"cmd:", cmd, "id:", p.ID(), "status:", p.Status(),
"metrics:", fmt.Sprintf("%+v", p.Metrics()),
"status:", p.Status(), "error:", p.Error(),
)
}
}
fmt.Println(strings.Repeat("=", 20), "end", strings.Repeat("=", 20))
time.Sleep(time.Second)
}
}()
}
func main() {
m := subproc.NewSubProcManager()
defer m.Stop()
m.Run("hello") // Continuous running
m.Run("mockPanic") // CrashLoopBackOff
m.Run("mockError") // CrashLoopBackOff
respCh := make(chan struct{})
var resp string
m.Run("mockSucc",
subproc.FinalHook(func(error) {
close(respCh)
}),
subproc.Response(&resp),
) // Run once and exit
<-respCh
fmt.Println("resp: ", resp) // resp: Hello world
printProcs(m)
/* you will see
cmd: hello restart: 0 status: Running error:
cmd: mockSucc restart: 0 status: Exited error:
cmd: mockPanic restart: 3 status: CrashLoopBackOff error: Command Error: exit status 1, Message: mock panic
cmd: mockError restart: 3 status: CrashLoopBackOff error: Command Error: exit status 1, Message: mock error
*/
m.Wait()
}
```