Eyal Shalev cac1b049af .
2020-12-29 18:03:02 +02:00
2020-04-20 17:00:22 +03:00
.
2020-12-29 18:03:02 +02:00
2020-04-20 13:46:20 +03:00
2020-04-20 13:46:20 +03:00
2020-04-20 13:46:20 +03:00
.
2020-12-10 12:56:21 +02:00
2020-04-20 17:03:10 +03:00
.
2020-12-10 12:56:21 +02:00
.
2020-12-29 18:03:02 +02:00

go-supervisor (V2)

Build Status codecov

Small library for supervising child processes in Go, it exposes Stdout,Stderr and Stdin in the "Go way" using channels...

Example

echo.sh print stuff to stdout and stderr and quit after 5 seconds...

#!/usr/bin/env bash

echo "STDOUT MESSAGE"
sleep 0.1
echo "STDERR MESSAGE" 1>&2
sleep 0.1

supervisor-exapmle.go spawn and supervise the bash program...

package main

import (
	"fmt"
	"path/filepath"
	"time"

	"github.com/kontera-technologies/go-supervisor/v2"
)

func main() {
	testDir, _ := filepath.Abs("testdata")
	events := make(chan supervisor.Event)
	p := supervisor.NewProcess(supervisor.ProcessOptions{
		Name:                 "./example.sh",
		Dir:                  testDir,
		Id:                   "example",
		EventNotifier:        events,
		OutputParser:         supervisor.MakeBytesParser,
		ErrorParser:          supervisor.MakeBytesParser,
		MaxSpawns:            4,
		MaxSpawnAttempts:     2,
		MaxInterruptAttempts: 3,
		MaxTerminateAttempts: 5,
		IdleTimeout:          10 * time.Second,
	})

	exit := make(chan bool)

	go func() {
		for {
			select {
			case msg := <-p.Stdout():
				fmt.Printf("Recived STDOUT message: %s\n", *msg)
			case msg := <-p.Stderr():
				fmt.Printf("Recived STDERR message: %s\n", *msg)
			case event := <-events:
				switch event.Code {
				case "ProcessStart":
					fmt.Printf("Recived event: %s\n", event.Code)
				default:
					fmt.Printf("Recived event: %s - %s\n", event.Code, event.Message)
				}
			case <-p.DoneNotifier():
				fmt.Println("Closing loop we are done...")
				close(exit)
				return
			}
		}
	}()

	if err := p.Start(); err != nil {
		panic(fmt.Sprintf("failed to start process: %s", err))
	}

	<-exit
}

running the program should produce this output

Recived event: ProcessStart
Recived STDOUT message: STDOUT MESSAGE
Recived STDERR message: STDERR MESSAGE
Recived event: ProcessDone - exit status 0
Recived event: StoppingHeartbeatMonitoring - Stop signal received.
Recived event: Sleep - Sleeping for 1s before respwaning instance.
Recived event: ProcessRespawn - Trying to respawn instance.
Recived event: ProcessStart
Recived STDOUT message: STDOUT MESSAGE
Recived STDERR message: STDERR MESSAGE
Recived event: ProcessDone - exit status 0
Recived event: StoppingHeartbeatMonitoring - Stop signal received.
Recived event: Sleep - Sleeping for 1s before respwaning instance.
Recived event: ProcessRespawn - Trying to respawn instance.
Recived event: ProcessStart
Recived STDOUT message: STDOUT MESSAGE
Recived STDERR message: STDERR MESSAGE
Recived event: ProcessDone - exit status 0
Recived event: StoppingHeartbeatMonitoring - Stop signal received.
Recived event: Sleep - Sleeping for 1s before respwaning instance.
Recived event: ProcessRespawn - Trying to respawn instance.
Recived event: ProcessStart
Recived STDOUT message: STDOUT MESSAGE
Recived STDERR message: STDERR MESSAGE
Recived event: ProcessDone - exit status 0
Recived event: StoppingHeartbeatMonitoring - Stop signal received.
Recived event: RespawnError - Max number of respawns reached.
Closing loop we are done...
Description
No description provided
Readme MIT 370 KiB
Languages
Go 100%