Created
April 27, 2020 17:35
-
-
Save refs/b2161859f3cf8900c6e82b3b79d0a27c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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