github.com/devcamcar/cli@v0.0.0-20181107134215-706a05759d18/objects/server/server.go (about) 1 package server 2 3 import ( 4 "log" 5 "os" 6 "os/exec" 7 "os/signal" 8 "syscall" 9 10 "github.com/fnproject/cli/common" 11 "github.com/urfave/cli" 12 ) 13 14 func update(c *cli.Context) error { 15 args := []string{"pull", 16 common.FunctionsDockerImage, 17 } 18 cmd := exec.Command("docker", args...) 19 cmd.Stdout = os.Stdout 20 cmd.Stderr = os.Stderr 21 err := cmd.Start() 22 if err != nil { 23 log.Fatalln("Starting command failed:", err) 24 } 25 26 done := make(chan error, 1) 27 go func() { 28 done <- cmd.Wait() 29 }() 30 // catch ctrl-c and kill 31 sigC := make(chan os.Signal, 2) 32 signal.Notify(sigC, os.Interrupt, syscall.SIGTERM) 33 select { 34 case <-sigC: 35 log.Println("Interrupt caught, exiting") 36 err = cmd.Process.Kill() 37 if err != nil { 38 log.Println("Error: could not kill process") 39 } 40 case err := <-done: 41 if err != nil { 42 log.Println("Processed finished with error:", err) 43 } else { 44 log.Println("Process finished gracefully") 45 } 46 } 47 return nil 48 }