Skip to content

Instantly share code, notes, and snippets.

@islishude
Created October 16, 2019 13:38
Show Gist options
  • Save islishude/9a3750a210e6f5532d32611b91edfef9 to your computer and use it in GitHub Desktop.
Save islishude/9a3750a210e6f5532d32611b91edfef9 to your computer and use it in GitHub Desktop.
golang daemon example
package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"path"
"path/filepath"
"syscall"
)
func createLogFile(fileName string) (fd *os.File, err error) {
dir := path.Dir(fileName)
if _, err = os.Stat(dir); err != nil && os.IsNotExist(err) {
if err = os.MkdirAll(dir, 0755); err != nil {
return
}
}
if fd, err = os.Create(fileName); err != nil {
return
}
return
}
func main() {
if os.Getppid() != 1 {
logFile, _ := createLogFile("main.log")
execPath, _ := filepath.Abs(os.Args[0])
args := append([]string{execPath}, os.Args[1:]...)
os.StartProcess(execPath, args, &os.ProcAttr{
Files: []*os.File{os.Stdin, logFile, logFile},
})
return
}
log.Println("pid is", os.Getpid())
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
log.Println("Call / at", req.RemoteAddr)
fmt.Fprintln(w, "hello,world")
})
server := http.Server{
Addr: ":8080",
Handler: mux,
}
go func() {
log.Println("Start...")
if err := server.ListenAndServe(); err != http.ErrServerClosed && err != nil {
log.Fatal(err)
}
}()
stopSignal := make(chan os.Signal, 1)
signal.Notify(stopSignal, syscall.SIGINT, syscall.SIGTERM)
<-stopSignal
server.Shutdown(context.Background())
log.Println("bye")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment