diff --git a/chocon.go b/chocon.go index 169dc2c..30f6e84 100644 --- a/chocon.go +++ b/chocon.go @@ -14,6 +14,7 @@ import ( "github.com/fukata/golang-stats-api-handler" "github.com/jessevdk/go-flags" "github.com/kazeburo/chocon/accesslog" + "github.com/kazeburo/chocon/pidfile" "github.com/kazeburo/chocon/proxy" "github.com/kazeburo/chocon/upstream" "github.com/lestrrat/go-server-starter-listener" @@ -32,6 +33,7 @@ type cmdOpts struct { LogDir string `long:"access-log-dir" default:"" description:"directory to store logfiles"` LogRotate int64 `long:"access-log-rotate" default:"30" description:"Number of day before remove logs"` Version bool `short:"v" long:"version" description:"Show version"` + PidFile string `long:"pid-file" default:"" description:"filename to store pid. disabled by default"` KeepaliveConns int `short:"c" default:"2" long:"keepalive-conns" description:"maximum keepalive connections for upstream"` MaxConnsPerHost int `long:"max-conns-per-host" default:"0" description:"maximum connections per host"` ReadTimeout int `long:"read-timeout" default:"30" description:"timeout of reading request"` @@ -118,6 +120,13 @@ func main() { log.Fatal(err) } + if opts.PidFile != "" { + err = pidfile.WritePid(opts.PidFile) + if err != nil { + log.Fatal(err) + } + } + transport := makeTransport(opts.KeepaliveConns, opts.MaxConnsPerHost, opts.ProxyReadTimeout) var handler http.Handler = proxy.New(&transport, Version, upstream, logger) diff --git a/pidfile/pidfile.go b/pidfile/pidfile.go new file mode 100644 index 0000000..f4f4831 --- /dev/null +++ b/pidfile/pidfile.go @@ -0,0 +1,32 @@ +package pidfile + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + + "github.com/pkg/errors" +) + +// WritePid : write pid to given file +func WritePid(pidfile string) error { + dir, filename := filepath.Split(pidfile) + tmpfile, err := ioutil.TempFile(dir, filename+".*") + if err != nil { + return errors.Wrap(err, "Could not create tempfile") + } + _, err = tmpfile.WriteString(fmt.Sprintf("%d", os.Getpid())) + if err != nil { + tmpfile.Close() + os.Remove(tmpfile.Name()) + return errors.Wrap(err, "Could not write pid to tempfile") + } + tmpfile.Close() + err = os.Rename(tmpfile.Name(), pidfile) + if err != nil { + os.Remove(tmpfile.Name()) + return errors.Wrap(err, "Could not rename pidfile") + } + return nil +}