Skip to content

Instantly share code, notes, and snippets.

@refs
Created April 27, 2020 17:35
Show Gist options
  • Save refs/b2161859f3cf8900c6e82b3b79d0a27c to your computer and use it in GitHub Desktop.
Save refs/b2161859f3cf8900c6e82b3b79d0a27c to your computer and use it in GitHub Desktop.
package main
import (
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"os/signal"
"strconv"
"syscall"
)
var (
daemon bool
children []*os.Process
childrenPID []int
extensions = []string{
"phoenix",
"konnectd",
}
command string
kill string // extension to kill
start string // extension to start
)
func init() {
flag.BoolVar(&daemon, "d", false, "runs as a daemon")
flag.StringVar(&command, "cmd", "", "commamnd to run as a fork")
flag.StringVar(&kill, "k", "", "extension to kill")
flag.StringVar(&start, "s", "", "extension to start")
flag.Parse()
}
var (
childSig = make(chan os.Signal)
parentSig = make(chan os.Signal)
)
func main() {
// kill an extension by name
if len(kill) > 0 {
contents, err := ioutil.ReadFile(kill + ".pid")
if err != nil {
log.Fatal(err)
}
PID, err := strconv.Atoi(string(contents))
if err != nil {
log.Fatal(err)
}
if err = syscall.Kill(PID, syscall.SIGKILL); err != nil {
log.Fatal(err)
}
fmt.Printf("PID: %v killed", PID)
if err = os.Remove(kill + ".pid"); err != nil {
log.Fatal(err)
}
return
}
// start an extension by name
if len(start) > 0 {
proc, err := os.StartProcess("/Users/aunger/go/bin/ocis", []string{"/Users/aunger/go/bin/ocis", start}, &os.ProcAttr{
Files: []*os.File{
os.Stdin,
os.Stdout,
os.Stderr,
},
Sys: &syscall.SysProcAttr{
Noctty: true,
},
})
if err != nil {
log.Fatal(err)
}
ioutil.WriteFile(start+".pid", []byte(strconv.Itoa(proc.Pid)), 0644)
}
for _, v := range extensions {
proc, err := os.StartProcess("/Users/aunger/go/bin/ocis", []string{"/Users/aunger/go/bin/ocis", v}, &os.ProcAttr{
Files: []*os.File{
os.Stdin,
os.Stdout,
os.Stderr,
},
})
if err != nil {
log.Fatal(err)
}
children = append(children, proc)
ioutil.WriteFile(v+".pid", []byte(strconv.Itoa(proc.Pid)), 0644)
}
signal.Notify(parentSig, os.Interrupt, os.Kill)
signal.Notify(childSig, os.Interrupt, os.Kill)
for {
select {
case <-parentSig:
// TODO range over pid files
for c := range children {
syscall.Kill(c, syscall.SIGKILL)
}
return
case <-childSig:
fmt.Println("deaded x.x")
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment