mirror of
https://github.com/rclone/rclone.git
synced 2024-12-13 10:45:16 +01:00
93 lines
1.7 KiB
Go
93 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() {
|
||
|
for {
|
||
|
time.Sleep(time.Second)
|
||
|
if _, ok := <-stop; ok {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
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
|
||
|
}
|