go build -o myservice
# installs and starts
./myservice
# plist file should be created
ls ~/Library/LaunchAgents/
# service should be registered
launchctl list | grep myservice
# show logs
tail -f /tmp/myservice.err.log
# stops and uninstalls
./myservice
Created
November 1, 2022 12:14
-
-
Save jpillora/f6ae03abc5f945fd74e7c9a88e45f7dd to your computer and use it in GitHub Desktop.
kardianos/service MacOS example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"log" | |
"time" | |
"github.com/kardianos/service" | |
) | |
type program struct { | |
ticking bool | |
} | |
func (p *program) Start(s service.Service) error { | |
if service.Interactive() { | |
log.Print("manage") | |
return p.manage(s) | |
} | |
log.Print("start") | |
go p.run() | |
return nil | |
} | |
func (p *program) manage(s service.Service) error { | |
if status, err := s.Status(); err == service.ErrNotInstalled { | |
log.Printf("installing...") | |
if err := s.Install(); err != nil { | |
return err | |
} | |
log.Printf("installed") | |
} else if err != nil { | |
return err | |
} else if status == service.StatusUnknown { | |
log.Printf("service unknown") | |
if err := s.Uninstall(); err == nil { | |
log.Printf("uninstalled") | |
} | |
} else if status == service.StatusStopped { | |
log.Printf("service stopped. starting...") | |
if err := s.Start(); err != nil { | |
return err | |
} | |
log.Printf("started") | |
} else { | |
log.Printf("service running") | |
if err := s.Uninstall(); err == nil { | |
log.Print("uninstalled") | |
} | |
} | |
return nil | |
} | |
func (p *program) run() { | |
for p.ticking { | |
log.Print("tick!") | |
time.Sleep(time.Second) | |
} | |
} | |
func (p *program) Stop(s service.Service) error { | |
log.Print("stop") | |
time.Sleep(100 * time.Millisecond) | |
p.ticking = false | |
return nil | |
} | |
func main() { | |
svcConfig := &service.Config{ | |
Name: "myservice", | |
Option: service.KeyValue{ | |
"UserService": true, | |
"LogOutput": true, | |
"LogDirectory": "/tmp", | |
}, | |
} | |
prg := &program{ | |
ticking: true, | |
} | |
s, err := service.New(prg, svcConfig) | |
if err != nil { | |
log.Fatal(err) | |
} | |
err = s.Run() | |
if err != nil { | |
log.Fatal(err) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment