Ignore SIGINT and SIGQUIT, timeouts for requests

pull/174/head
Simon Let 4 years ago
parent 2799a51376
commit 45c66208a1
No known key found for this signature in database
GPG Key ID: D650C65DD46D431D
  1. 2
      Makefile
  2. 28
      cmd/daemon/kill.go
  3. 55
      cmd/daemon/main.go
  4. 39
      cmd/daemon/status.go
  5. 12
      pkg/httpclient/httpclient.go
  6. 14
      pkg/signalhandler/signalhander.go
  7. 3
      scripts/util.sh

@ -14,7 +14,7 @@ install: build
test:
go test -v ./...
go vet ./...
scripts/test.sh --all
scripts/test.sh
rebuild:
make clean

@ -0,0 +1,28 @@
package main
import (
"io/ioutil"
"log"
"os/exec"
"strconv"
"strings"
)
func killDaemon(pidfile string) error {
dat, err := ioutil.ReadFile(pidfile)
if err != nil {
log.Println("Reading pid file failed", err)
}
log.Print(string(dat))
pid, err := strconv.Atoi(strings.TrimSuffix(string(dat), "\n"))
if err != nil {
log.Fatal("Pidfile contents are malformed", err)
}
cmd := exec.Command("kill", "-s", "sigint", strconv.Itoa(pid))
err = cmd.Run()
if err != nil {
log.Printf("Command finished with error: %v", err)
return err
}
return nil
}

@ -1,22 +1,17 @@
package main
import (
//"flag"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"os"
"os/exec"
"os/user"
"path/filepath"
"strconv"
"strings"
"github.com/BurntSushi/toml"
"github.com/curusarn/resh/pkg/cfg"
"github.com/curusarn/resh/pkg/msg"
)
// version from git set during build
@ -89,51 +84,3 @@ func main() {
}
log.Println("main: Shutdown - bye")
}
func statusHandler(w http.ResponseWriter, r *http.Request) {
log.Println("/status START")
resp := msg.StatusResponse{
Status: true,
Version: version,
Commit: commit,
}
jsn, err := json.Marshal(&resp)
if err != nil {
log.Println("Encoding error:", err)
log.Println("Response:", resp)
return
}
w.Write(jsn)
log.Println("/status END")
}
func killDaemon(pidfile string) error {
dat, err := ioutil.ReadFile(pidfile)
if err != nil {
log.Println("Reading pid file failed", err)
}
log.Print(string(dat))
pid, err := strconv.Atoi(strings.TrimSuffix(string(dat), "\n"))
if err != nil {
log.Fatal("Pidfile contents are malformed", err)
}
cmd := exec.Command("kill", "-s", "sigint", strconv.Itoa(pid))
err = cmd.Run()
if err != nil {
log.Printf("Command finished with error: %v", err)
return err
}
return nil
}
func isDaemonRunning(port int) (bool, error) {
url := "http://localhost:" + strconv.Itoa(port) + "/status"
resp, err := http.Get(url)
if err != nil {
log.Println("Error while checking daemon status - "+
"it's probably not running!", err)
return false, err
}
defer resp.Body.Close()
return true, nil
}

@ -0,0 +1,39 @@
package main
import (
"encoding/json"
"log"
"net/http"
"strconv"
"github.com/curusarn/resh/pkg/msg"
)
func statusHandler(w http.ResponseWriter, r *http.Request) {
log.Println("/status START")
resp := msg.StatusResponse{
Status: true,
Version: version,
Commit: commit,
}
jsn, err := json.Marshal(&resp)
if err != nil {
log.Println("Encoding error:", err)
log.Println("Response:", resp)
return
}
w.Write(jsn)
log.Println("/status END")
}
func isDaemonRunning(port int) (bool, error) {
url := "http://localhost:" + strconv.Itoa(port) + "/status"
resp, err := http.Get(url)
if err != nil {
log.Println("Error while checking daemon status - "+
"it's probably not running!", err)
return false, err
}
defer resp.Body.Close()
return true, nil
}

@ -0,0 +1,12 @@
package httpclient
import (
"net/http"
"time"
)
func New() *http.Client {
return &http.Client{
Timeout: 100 * time.Millisecond,
}
}

@ -25,7 +25,7 @@ func sendSignals(sig os.Signal, subscribers []chan os.Signal, done chan string)
case _ = <-done:
chanCount--
if chanCount == 0 {
log.Println("signalhandler: All boxes shut down successfully")
log.Println("signalhandler: All components shut down successfully")
return
}
default:
@ -42,12 +42,20 @@ func sendSignals(sig os.Signal, subscribers []chan os.Signal, done chan string)
func Run(subscribers []chan os.Signal, done chan string, server *http.Server) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, syscall.SIGSTOP, syscall.SIGQUIT)
var sig os.Signal
for {
sig := <-signals
log.Println("signalhandler: Got signal " + sig.String())
if sig == syscall.SIGTERM {
// Shutdown daemon on SIGTERM
break
}
log.Printf("signalhandler: Ignoring signal %s. Send SIGTERM to trigger shutdown.\n", sig.String())
}
log.Println("signalhandler: Sending signals to Subscribers")
log.Println("signalhandler: Sending shutdown signals to components")
sendSignals(sig, subscribers, done)
log.Println("signalhandler: Shutting down the server")

@ -53,6 +53,9 @@ __resh_run_daemon() {
# hotfix
gnohup resh-daemon >| ~/.resh/daemon_last_run_out.txt 2>&1 & disown
else
# TODO: switch to nohup for consistency once you confirm that daemon is
# not getting killed anymore on macOS
# nohup resh-daemon >| ~/.resh/daemon_last_run_out.txt 2>&1 & disown
setsid resh-daemon >| ~/.resh/daemon_last_run_out.txt 2>&1 & disown
fi
}

Loading…
Cancel
Save