From 2f11acd0a7e2315f7a591193bf4c7d21fa102219 Mon Sep 17 00:00:00 2001 From: Isaac Rogers Date: Sun, 28 May 2017 20:01:19 +1200 Subject: [PATCH 1/2] main: cancel commands on sigint/sigterm --- main.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index dac72e0..b19903e 100644 --- a/main.go +++ b/main.go @@ -2,14 +2,17 @@ package main import ( "bufio" + "context" "flag" "fmt" "io" "log" "os" "os/exec" + "os/signal" "strings" "sync" + "syscall" ) type database struct { @@ -61,6 +64,9 @@ func main() { out := make(chan string) go println(out) + quitContext, cancel := context.WithCancel(context.Background()) + go awaitSignal(cancel) + var wg sync.WaitGroup wg.Add(len(targetDatabases)) @@ -68,7 +74,7 @@ func main() { for _, k := range targetDatabases { go func(db database, k string) { defer wg.Done() - if r := runSQL(db, sql, k, len(targetDatabases) > 1, out); !r { + if r := runSQL(quitContext, db, sql, k, len(targetDatabases) > 1, out); !r { returnCode = 1 } }(databases[k], k) @@ -78,7 +84,7 @@ func main() { os.Exit(returnCode) } -func runSQL(db database, sql string, key string, prependKey bool, out chan string) bool { +func runSQL(quitContext context.Context, db database, sql string, key string, prependKey bool, out chan string) bool { userOption := "" if db.User != "" { userOption = fmt.Sprintf("-u %v ", db.User) @@ -105,10 +111,10 @@ func runSQL(db database, sql string, key string, prependKey bool, out chan strin var cmd *exec.Cmd if db.AppServer != "" { query := fmt.Sprintf(`'%v'`, strings.Replace(sql, `'`, `'"'"'`, -1)) - cmd = exec.Command("ssh", db.AppServer, mysql+options+query) + cmd = exec.CommandContext(quitContext, "ssh", db.AppServer, mysql+options+query) } else { args := append(trimEmpty(strings.Split(options, " ")), sql) - cmd = exec.Command("mysql", args...) + cmd = exec.CommandContext(quitContext, "mysql", args...) } stdout, err := cmd.StdoutPipe() @@ -187,3 +193,10 @@ func trimEmpty(s []string) []string { } return r } + +func awaitSignal(cancel context.CancelFunc) { + signals := make(chan os.Signal, 1) + signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM) + <-signals + cancel() +} From fb772b026fe2b1bfd70a9e7ed5fd66ec1ea509d0 Mon Sep 17 00:00:00 2001 From: Isaac Rogers Date: Mon, 29 May 2017 08:48:39 +1200 Subject: [PATCH 2/2] remove unnecessary channel buffer --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index b19903e..f745ab3 100644 --- a/main.go +++ b/main.go @@ -195,7 +195,7 @@ func trimEmpty(s []string) []string { } func awaitSignal(cancel context.CancelFunc) { - signals := make(chan os.Signal, 1) + signals := make(chan os.Signal) signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM) <-signals cancel()