This is a creation in Article, where the information may have evolved or changed.
Package Main
Import (
"FMT"
"Log"
"Net/http"
"OS"
"Os/signal"
"Syscall"
)
Func Main () {
File, err: = OS. Create ("Log")
If err! = Nil {
Fmt. PRINTLN ("Create log file Error", err)
Return
}
Log. Setoutput (File)
CE ("pid")
}
Func CE (PID string) {
File, err: = OS. OpenFile (PID, OS. O_rdwr|os. O_create, 0644)
If err! = Nil {
Log. PRINTLN (ERR)
Return
}
Info, _: = File.stat ()
If info. Size ()! = 0 {
Log. Println ("pid file is exist")
Return
}
If OS. Getppid ()! = 1 {
Args: = Append ([]string{os. Args[0]}, OS. Args[1:] ...)
Os. StartProcess (OS. Args[0], args, &os. Procattr{files: []*os. File{os. Stdin, OS. Stdout, OS. Stderr}})
Return
}
File.writestring (FMT. Sprint (OS. Getpid ()))
c: = Make (chan os. Signal, 1)
Signal. Notify (c, OS. Interrupt, Syscall. SIGUSR2)
Go Httpserver ()
for {
S: = <-c
Switch S {
Case Syscall. SIGUSR2:
Fmt. PRINTLN ("Custom model.")
Case OS. Interrupt:
Fmt. PRINTLN ("Safe exit")
Exit (File)
}
}
}
Func Httpserver () {
http. Handlefunc ("/", route)
http. Listenandserve (": 1789", nil)
}
Func Route (W http. Responsewriter, R *http. Request) {
Log. Println (R.url. Path)
Fmt. Fprint (W, "Hello world\n")
}
Func Exit (F *os. File) {
F.close ()
Os. Remove (F.name ())
Fmt. Println ("Bye")
}