33 lines
809 B
Go
33 lines
809 B
Go
|
package systemd
|
||
|
|
||
|
import (
|
||
|
"log"
|
||
|
"sync"
|
||
|
|
||
|
sysdnotify "github.com/iguanesolutions/go-systemd/v5/notify"
|
||
|
"github.com/rclone/rclone/lib/atexit"
|
||
|
)
|
||
|
|
||
|
// Notify systemd that the service is starting. This returns a
|
||
|
// function which should be called to notify that the service is
|
||
|
// stopping. This function will be called on exit if the service exits
|
||
|
// on a signal.
|
||
|
func Notify() func() {
|
||
|
if err := sysdnotify.Ready(); err != nil {
|
||
|
log.Printf("failed to notify ready to systemd: %v", err)
|
||
|
}
|
||
|
var finaliseOnce sync.Once
|
||
|
finalise := func() {
|
||
|
finaliseOnce.Do(func() {
|
||
|
if err := sysdnotify.Stopping(); err != nil {
|
||
|
log.Printf("failed to notify stopping to systemd: %v", err)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
finaliseHandle := atexit.Register(finalise)
|
||
|
return func() {
|
||
|
atexit.Unregister(finaliseHandle)
|
||
|
finalise()
|
||
|
}
|
||
|
}
|