Skip to content

Instantly share code, notes, and snippets.

@jpillora
Created November 1, 2022 12:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jpillora/f6ae03abc5f945fd74e7c9a88e45f7dd to your computer and use it in GitHub Desktop.
Save jpillora/f6ae03abc5f945fd74e7c9a88e45f7dd to your computer and use it in GitHub Desktop.
kardianos/service MacOS example

Usage on MacOS

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
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