From c6e386bdfe69a371258fc0b3084327536a5f82d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkan=20Durmu=C5=9F?= Date: Wed, 20 Sep 2017 19:57:40 +0300 Subject: [PATCH 1/6] Removed syscall CGO dependency It was a pain while cross compiling for FreeBSD. --- daemon_freebsd.go | 45 ++++++++++----------------------------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/daemon_freebsd.go b/daemon_freebsd.go index c7cbbb9..9451c4e 100644 --- a/daemon_freebsd.go +++ b/daemon_freebsd.go @@ -1,11 +1,6 @@ package daemon -//#include -//#include -import "C" - import ( - "bytes" "fmt" "io/ioutil" "os" @@ -14,7 +9,6 @@ import ( "regexp" "strings" "text/template" - "unsafe" ) // systemVRecord - standard record (struct) for linux systemV version of daemon package @@ -76,36 +70,17 @@ func newDaemon(name, description string, dependencies []string) (Daemon, error) return &bsdRecord{name, description, dependencies}, nil } -// From https://github.com/VividCortex/godaemon/blob/master/daemon_freebsd.go (MIT) -func execPath() (string, error) { - PATH_MAX := 1024 // From - exePath := make([]byte, PATH_MAX) - exeLen := C.size_t(len(exePath)) - - // Beware: sizeof(int) != sizeof(C.int) - var mib [4]C.int - // From - mib[0] = 1 // CTL_KERN - mib[1] = 14 // KERN_PROC - mib[2] = 12 // KERN_PROC_PATHNAME - mib[3] = -1 - - status, err := C.sysctl((*C.int)(unsafe.Pointer(&mib[0])), 4, unsafe.Pointer(&exePath[0]), &exeLen, nil, 0) - - if err != nil { - return "", fmt.Errorf("sysctl: %v", err) - } - - // Not sure why this might happen with err being nil, but... - if status != 0 { - return "", fmt.Errorf("sysctl returned %d", status) +func execPath() (name string, err error) { + name = os.Args[0] + if name[0] == '.' { + name, err = filepath.Abs(name) + if err == nil { + name = filepath.Clean(name) + } + } else { + name, err = exec.LookPath(filepath.Clean(name)) } - - // Convert from null-padded []byte to a clean string. (Can't simply cast!) - exePathStringLen := bytes.Index(exePath, []byte{0}) - exePathString := string(exePath[:exePathStringLen]) - - return filepath.Clean(exePathString), nil + return name, err } // Check service is running From c55c3e6c2b0f7c52f51474b1cfcede7c211d2f1c Mon Sep 17 00:00:00 2001 From: maximus12793 Date: Sun, 15 Oct 2017 21:15:12 -0700 Subject: [PATCH 2/6] added cron job example --- README.md | 5 +++ example/cron_example.go | 95 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 example/cron_example.go diff --git a/README.md b/README.md index f89bb82..8bc22e0 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,11 @@ func main() { } ``` +Cron example: +``` +See example/cron_example.go +``` + ## Contributors (unsorted) - [Igor Dolzhikov](https://github.com/takama) diff --git a/example/cron_example.go b/example/cron_example.go new file mode 100644 index 0000000..9b2320f --- /dev/null +++ b/example/cron_example.go @@ -0,0 +1,95 @@ +package main + +import ( + "fmt" + "github.com/robfig/cron" + "github.com/takama/daemon" + "log" + "os" +) + +const ( + // name of the service + name = "goCron" + description = "Cron service example" +) + +var stdlog, errlog *log.Logger + +// Service is the daemon service struct +type Service struct { + d daemon.Daemon +} + +func startCron(c *cron.Cron) { + // Run 1x every min + c.AddFunc("* * * * * *", func() { makeFile() }) + c.Start() + for { + + } +} + +var times int + +func makeFile() { + // create a simple file $times.txt + times++ + f, err := os.Create(fmt.Sprintf("/SOMEPATH/%d.txt", times)) + if err != nil { + log.Fatal(err) + } + defer f.Close() +} + +// Manage by daemon commands or run the daemon +func (service *Service) Manage() (string, error) { + + // Create a new cron manager + c := cron.New() + usage := "Usage: cronStock install | remove | start | stop | status" + // If received any kind of command, do it + if len(os.Args) > 1 { + command := os.Args[1] + switch command { + case "install": + return service.d.Install() + case "remove": + return service.d.Remove() + case "start": + return service.d.Start() + case "stop": + // No need to explicitly stop cron since job will be killed + return service.d.Stop() + case "status": + return service.d.Status() + default: + return usage, nil + } + } + // Begin cron job + go startCron(c) + for { + //EventLoop to keep cron running + } + // Unreachable, but required + return usage, nil +} +func init() { + stdlog = log.New(os.Stdout, "", log.Ldate|log.Ltime) + errlog = log.New(os.Stderr, "", log.Ldate|log.Ltime) +} +func main() { + srv, err := daemon.New(name, description) + if err != nil { + errlog.Println("Error: ", err) + os.Exit(1) + } + service := &Service{srv} + status, err := service.Manage() + if err != nil { + errlog.Println(status, "\nError: ", err) + os.Exit(1) + } + fmt.Println(status) +} From d5de8b76abe1e348bf5751c747e0d17cf9c92828 Mon Sep 17 00:00:00 2001 From: maximus12793 Date: Sun, 15 Oct 2017 21:46:51 -0700 Subject: [PATCH 3/6] cleanup cron function --- example/cron_example.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/example/cron_example.go b/example/cron_example.go index 9b2320f..5c111d2 100644 --- a/example/cron_example.go +++ b/example/cron_example.go @@ -24,10 +24,7 @@ type Service struct { func startCron(c *cron.Cron) { // Run 1x every min c.AddFunc("* * * * * *", func() { makeFile() }) - c.Start() - for { - - } + c.Run() } var times int From c445b2be66d31fbaf807b8455abc4fa1898be19e Mon Sep 17 00:00:00 2001 From: Igor Dolzhikov Date: Sun, 29 Oct 2017 12:51:48 +0700 Subject: [PATCH 4/6] move examples --- example/cron_example.go => examples/cron/cron.go | 11 ++++++----- {example => examples}/myservice.go | 0 2 files changed, 6 insertions(+), 5 deletions(-) rename example/cron_example.go => examples/cron/cron.go (95%) rename {example => examples}/myservice.go (100%) diff --git a/example/cron_example.go b/examples/cron/cron.go similarity index 95% rename from example/cron_example.go rename to examples/cron/cron.go index 5c111d2..c85e150 100644 --- a/example/cron_example.go +++ b/examples/cron/cron.go @@ -2,10 +2,11 @@ package main import ( "fmt" - "github.com/robfig/cron" - "github.com/takama/daemon" "log" "os" + + "github.com/robfig/cron" + "github.com/takama/daemon" ) const ( @@ -67,15 +68,15 @@ func (service *Service) Manage() (string, error) { // Begin cron job go startCron(c) for { - //EventLoop to keep cron running + // EventLoop to keep cron running } - // Unreachable, but required - return usage, nil } + func init() { stdlog = log.New(os.Stdout, "", log.Ldate|log.Ltime) errlog = log.New(os.Stderr, "", log.Ldate|log.Ltime) } + func main() { srv, err := daemon.New(name, description) if err != nil { diff --git a/example/myservice.go b/examples/myservice.go similarity index 100% rename from example/myservice.go rename to examples/myservice.go From 89a7e74cb06523f58a274ba090f0239d99c96f42 Mon Sep 17 00:00:00 2001 From: Igor Dolzhikov Date: Sun, 29 Oct 2017 13:29:55 +0700 Subject: [PATCH 5/6] Added some corrections in cron job example --- examples/cron/{cron.go => cron_job.go} | 56 +++++++++++++------------- 1 file changed, 29 insertions(+), 27 deletions(-) rename examples/cron/{cron.go => cron_job.go} (56%) diff --git a/examples/cron/cron.go b/examples/cron/cron_job.go similarity index 56% rename from examples/cron/cron.go rename to examples/cron/cron_job.go index c85e150..7102297 100644 --- a/examples/cron/cron.go +++ b/examples/cron/cron_job.go @@ -4,6 +4,9 @@ import ( "fmt" "log" "os" + "os/signal" + "syscall" + "time" "github.com/robfig/cron" "github.com/takama/daemon" @@ -11,29 +14,20 @@ import ( const ( // name of the service - name = "goCron" - description = "Cron service example" + name = "cron_job" + description = "Cron job service example" ) var stdlog, errlog *log.Logger // Service is the daemon service struct type Service struct { - d daemon.Daemon + daemon.Daemon } -func startCron(c *cron.Cron) { - // Run 1x every min - c.AddFunc("* * * * * *", func() { makeFile() }) - c.Run() -} - -var times int - func makeFile() { - // create a simple file $times.txt - times++ - f, err := os.Create(fmt.Sprintf("/SOMEPATH/%d.txt", times)) + // create a simple file (current time).txt + f, err := os.Create(fmt.Sprintf("%s/%s.txt", os.TempDir(), time.Now().Format(time.RFC3339))) if err != nil { log.Fatal(err) } @@ -43,33 +37,41 @@ func makeFile() { // Manage by daemon commands or run the daemon func (service *Service) Manage() (string, error) { - // Create a new cron manager - c := cron.New() - usage := "Usage: cronStock install | remove | start | stop | status" + usage := "Usage: cron_job install | remove | start | stop | status" // If received any kind of command, do it if len(os.Args) > 1 { command := os.Args[1] switch command { case "install": - return service.d.Install() + return service.Install() case "remove": - return service.d.Remove() + return service.Remove() case "start": - return service.d.Start() + return service.Start() case "stop": // No need to explicitly stop cron since job will be killed - return service.d.Stop() + return service.Stop() case "status": - return service.d.Status() + return service.Status() default: return usage, nil } } - // Begin cron job - go startCron(c) - for { - // EventLoop to keep cron running - } + // Set up channel on which to send signal notifications. + // We must use a buffered channel or risk missing the signal + // if we're not ready to receive when the signal is sent. + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt, os.Kill, syscall.SIGTERM) + + // Create a new cron manager + c := cron.New() + // Run makefile every min + c.AddFunc("* * * * * *", makeFile) + c.Start() + // Waiting for interrupt by system signal + killSignal := <-interrupt + stdlog.Println("Got signal:", killSignal) + return "Service exited", nil } func init() { From 7c932cb6d628372167489c6f9f4c92af24220db6 Mon Sep 17 00:00:00 2001 From: Igor Dolzhikov Date: Sun, 29 Oct 2017 13:31:33 +0700 Subject: [PATCH 6/6] Bumped version number to 0.9.2 --- daemon.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.go b/daemon.go index 2a65b22..700d8e7 100644 --- a/daemon.go +++ b/daemon.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. /* -Package daemon 0.9.1 for use with Go (golang) services. +Package daemon 0.9.2 for use with Go (golang) services. Package daemon provides primitives for daemonization of golang services. This package is not provide implementation of user daemon,