mirror of
https://github.com/rclone/rclone.git
synced 2024-12-11 17:51:12 +01:00
96 lines
1.7 KiB
Go
96 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"github.com/sevlyar/go-daemon"
|
|
"log"
|
|
"os"
|
|
"syscall"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
signal = flag.String("s", "", `send signal to the daemon
|
|
quit — graceful shutdown
|
|
stop — fast shutdown
|
|
reload — reloading the configuration file`)
|
|
)
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
daemon.AddCommand(daemon.StringFlag(signal, "quit"), syscall.SIGQUIT, termHandler)
|
|
daemon.AddCommand(daemon.StringFlag(signal, "stop"), syscall.SIGTERM, termHandler)
|
|
daemon.AddCommand(daemon.StringFlag(signal, "reload"), syscall.SIGHUP, reloadHandler)
|
|
|
|
cntxt := &daemon.Context{
|
|
PidFileName: "pid",
|
|
PidFilePerm: 0644,
|
|
LogFileName: "log",
|
|
LogFilePerm: 0640,
|
|
WorkDir: "./",
|
|
Umask: 027,
|
|
Args: []string{"[go-daemon sample]"},
|
|
}
|
|
|
|
if len(daemon.ActiveFlags()) > 0 {
|
|
d, err := cntxt.Search()
|
|
if err != nil {
|
|
log.Fatalln("Unable send signal to the daemon:", err)
|
|
}
|
|
daemon.SendCommands(d)
|
|
return
|
|
}
|
|
|
|
d, err := cntxt.Reborn()
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
if d != nil {
|
|
return
|
|
}
|
|
defer cntxt.Release()
|
|
|
|
log.Println("- - - - - - - - - - - - - - -")
|
|
log.Println("daemon started")
|
|
|
|
go worker()
|
|
|
|
err = daemon.ServeSignals()
|
|
if err != nil {
|
|
log.Println("Error:", err)
|
|
}
|
|
log.Println("daemon terminated")
|
|
}
|
|
|
|
var (
|
|
stop = make(chan struct{})
|
|
done = make(chan struct{})
|
|
)
|
|
|
|
func worker() {
|
|
LOOP:
|
|
for {
|
|
time.Sleep(time.Second) // this is work to be done by worker.
|
|
select {
|
|
case <- stop:
|
|
break LOOP
|
|
default:
|
|
}
|
|
}
|
|
done <- struct{}{}
|
|
}
|
|
|
|
func termHandler(sig os.Signal) error {
|
|
log.Println("terminating...")
|
|
stop <- struct{}{}
|
|
if sig == syscall.SIGQUIT {
|
|
<-done
|
|
}
|
|
return daemon.ErrStop
|
|
}
|
|
|
|
func reloadHandler(sig os.Signal) error {
|
|
log.Println("configuration reloaded")
|
|
return nil
|
|
}
|