Commit 187e36f
pkg/procfile/parse.go
@@ -0,0 +1,62 @@
+package procfile
+
+import (
+ "bufio"
+ "log"
+ "os"
+ "os/exec"
+ "strings"
+ "syscall"
+)
+
+type Proc struct {
+ name string
+ args []string
+}
+
+func New(name string, args []string) *Proc {
+ return &Proc{
+ name: name,
+ args: args,
+ }
+}
+
+func Parse(procfilePath string) []*Proc {
+ file, err := os.Open(procfilePath)
+ if err != nil {
+ log.Fatalln(err)
+ }
+ defer file.Close()
+
+ var processes []*Proc
+ scanner := bufio.NewScanner(file)
+
+ for scanner.Scan() {
+ line := strings.TrimSpace(scanner.Text())
+ if line == "" || strings.HasPrefix(line, "#") {
+ continue
+ }
+
+ parts := strings.SplitN(line, ":", 2)
+ if len(parts) != 2 {
+ continue
+ }
+
+ args := strings.Fields(os.ExpandEnv(strings.TrimSpace(parts[1])))
+ if len(args) == 0 {
+ continue
+ }
+
+ processes = append(processes, New(parts[0], args))
+ }
+
+ return processes
+}
+
+func (p *Proc) NewCommand() *exec.Cmd {
+ cmd := exec.Command(p.args[0], p.args[1:]...)
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
+ return cmd
+}
main.go
@@ -1,7 +1,6 @@
package main
import (
- "bufio"
"flag"
"log"
"os"
@@ -12,6 +11,8 @@ import (
"sync/atomic"
"syscall"
"time"
+
+ "github.com/xlgmokha/minit/pkg/procfile"
)
var procfilePath *string
@@ -23,57 +24,32 @@ func init() {
}
func main() {
- file, err := os.Open(*procfilePath)
- if err != nil {
- log.Fatalln(err)
- }
- defer file.Close()
-
- var cmds []*exec.Cmd
var wg sync.WaitGroup
var shutdown int32
- scanner := bufio.NewScanner(file)
- for scanner.Scan() {
- line := strings.TrimSpace(scanner.Text())
- if line == "" || strings.HasPrefix(line, "#") {
- continue
- }
-
- parts := strings.SplitN(line, ":", 2)
- if len(parts) != 2 {
- continue
- }
-
- args := strings.Fields(os.ExpandEnv(strings.TrimSpace(parts[1])))
- if len(args) == 0 {
- continue
- }
-
- cmd := exec.Command(args[0], args[1:]...)
- cmd.Stdout = os.Stdout
- cmd.Stderr = os.Stderr
- cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
-
- cmds = append(cmds, cmd)
-
- wg.Add(1)
- go func(args []string) {
- defer wg.Done()
- for atomic.LoadInt32(&shutdown) == 0 {
- cmd := exec.Command(args[0], args[1:]...)
- cmd.Stdout = os.Stdout
- cmd.Stderr = os.Stderr
- cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
+ for _, path := range strings.Split(*procfilePath, ",") {
+ for _, proc := range procfile.Parse(path) {
+ wg.Add(1)
+ go func(proc *procfile.Proc) {
+ defer wg.Done()
+ var cmd *exec.Cmd
+
+ for atomic.LoadInt32(&shutdown) == 0 {
+ cmd = proc.NewCommand()
+
+ if cmd.Start() != nil {
+ time.Sleep(2 * time.Second)
+ continue
+ }
+ cmd.Wait()
+ time.Sleep(time.Second)
+ }
- if cmd.Start() != nil {
- time.Sleep(2 * time.Second)
- continue
+ if cmd != nil && cmd.Process != nil {
+ syscall.Kill(-cmd.Process.Pid, syscall.SIGTERM)
}
- cmd.Wait()
- time.Sleep(time.Second)
- }
- }(args)
+ }(proc)
+ }
}
sigChan := make(chan os.Signal, 1)
@@ -82,12 +58,6 @@ func main() {
go func() {
<-sigChan
atomic.StoreInt32(&shutdown, 1)
-
- for _, cmd := range cmds {
- if cmd.Process != nil {
- syscall.Kill(-cmd.Process.Pid, syscall.SIGTERM)
- }
- }
}()
wg.Wait()