A Go library for generating and managing systemd service and timer units programmatically.
- Generate systemd service units from your Go applications
- Create oneshot services with timers for scheduled tasks
- Automatically setup and manage systemd services
- Simple API for common systemd operations
go get github.com/akademic/systemderpackage main
import (
"log"
"github.com/akademic/systemder"
)
func main() {
// Create a logger (or use NullLogger for no logging)
logger := &systemder.NullLogger{}
// Create systemder instance
sys := systemder.NewSystemder(logger)
// Setup a service that will run your current executable
err := sys.SetupService("My Go Application", "myapp")
if err != nil {
log.Fatal(err)
}
log.Println("Service 'myapp.service' created and started!")
}package main
import (
"log"
"github.com/akademic/systemder"
)
func main() {
logger := &systemder.NullLogger{}
sys := systemder.NewSystemder(logger)
// Create a timer that runs every hour with arguments
args := []string{"--cleanup", "--verbose"}
err := sys.SetupTimer(
"Hourly cleanup task",
"hourly", // OnCalendar specification
"cleanup-task", // Service name
args, // Arguments to pass
)
if err != nil {
log.Fatal(err)
}
log.Println("Timer 'cleanup-task.timer' created and started!")
}Creates a systemd service unit, enables it, and starts it.
func (s *Systemder) SetupService(desc, name string) errorParameters:
desc: Description for the servicename: Name of the service (without .service extension)
Example:
err := sys.SetupService("My web server", "webserver")
// Creates: webserver.serviceCreates a systemd timer with associated oneshot service, enables it, and starts it.
func (s *Systemder) SetupTimer(desc, onCalendar, name string, args []string) errorParameters:
desc: Description for the timer and serviceonCalendar: Systemd calendar specification (e.g., "daily", "hourly", "Mon --* 00:00:00")name: Base name for the timer and serviceargs: Command line arguments to pass to the executable
Example:
// Run daily at midnight
err := sys.SetupTimer("Daily backup", "daily", "backup", []string{"--full"})
// Creates: backup.service and backup.timer
// Run every 5 minutes
err := sys.SetupTimer("Frequent check", "*:0/5", "healthcheck", nil)Generates a systemd service unit content as a string.
func (s *Systemder) GenerateService(desc string) (string, error)Generates a oneshot service unit content.
func (s *Systemder) GenerateOneshot(desc, name string, args []string) (string, error)Generates a timer unit content.
func (s *Systemder) GenerateTimer(desc string, service string, onCalendar string) (string, error)Generates and writes a service unit file to /etc/systemd/system/.
func (s *Systemder) GenerateAndWriteService(desc, name string) errorGenerates and writes both oneshot service and timer unit files.
func (s *Systemder) GenerateAndWriteTimer(desc, onCalendar, name string, args []string) errorCommon onCalendar values for timers:
"minutely"- Every minute"hourly"- Every hour"daily"- Every day at midnight"weekly"- Every week"monthly"- Every month"*:0/5"- Every 5 minutes"Mon,Tue *-*-* 10:00:00"- Monday and Tuesday at 10 AM"*-*-* 06:00:00"- Every day at 6 AM
sys := systemder.NewSystemder(&systemder.NullLogger{})
// Just generate the unit content without writing
serviceUnit, err := sys.GenerateService("My service description")
if err != nil {
log.Fatal(err)
}
fmt.Println(serviceUnit)
// Output: systemd service unit content- Linux system with systemd
- Root privileges (for writing to
/etc/systemd/system/)
- All unit files are written to
/etc/systemd/system/ - Services use the current executable path automatically
- Working directory is set to the executable's directory