diff --git a/cmd/cmount/mount.go b/cmd/cmount/mount.go index 2c946d54f..ecac974c5 100644 --- a/cmd/cmount/mount.go +++ b/cmd/cmount/mount.go @@ -21,6 +21,7 @@ import ( "github.com/ncw/rclone/fs" "github.com/ncw/rclone/vfs" "github.com/ncw/rclone/vfs/vfsflags" + "github.com/okzk/sdnotify" "github.com/pkg/errors" ) @@ -180,6 +181,10 @@ func Mount(f fs.Fs, mountpoint string) error { sigHup := make(chan os.Signal, 1) signal.Notify(sigHup, syscall.SIGHUP) + if err := sdnotify.SdNotifyReady(); err != nil && err != sdnotify.SdNotifyNoSocket { + return errors.Wrap(err, "failed to notify systemd") + } + waitloop: for { select { @@ -197,6 +202,7 @@ waitloop: } } + _ = sdnotify.SdNotifyStopping() if err != nil { return errors.Wrap(err, "failed to umount FUSE fs") } diff --git a/cmd/mount/mount.go b/cmd/mount/mount.go index 05f1d459d..9a3aac144 100644 --- a/cmd/mount/mount.go +++ b/cmd/mount/mount.go @@ -15,6 +15,7 @@ import ( "github.com/ncw/rclone/fs" "github.com/ncw/rclone/vfs" "github.com/ncw/rclone/vfs/vfsflags" + "github.com/okzk/sdnotify" "github.com/pkg/errors" ) @@ -126,6 +127,10 @@ func Mount(f fs.Fs, mountpoint string) error { sigHup := make(chan os.Signal, 1) signal.Notify(sigHup, syscall.SIGHUP) + if err := sdnotify.SdNotifyReady(); err != nil && err != sdnotify.SdNotifyNoSocket { + return errors.Wrap(err, "failed to notify systemd") + } + waitloop: for { select { @@ -147,6 +152,7 @@ waitloop: } } + _ = sdnotify.SdNotifyStopping() if err != nil { return errors.Wrap(err, "failed to umount FUSE fs") } diff --git a/cmd/mountlib/mount.go b/cmd/mountlib/mount.go index 1f801d2bb..c08bbfe01 100644 --- a/cmd/mountlib/mount.go +++ b/cmd/mountlib/mount.go @@ -156,6 +156,14 @@ Assuming only one rclone instance is running, you can reset the cache like this: kill -SIGHUP $(pidof rclone) + +### systemd ### + +When running rclone ` + commandName + ` as a systemd service, it is possible +to use Type=notify. In this case the service will enter the started state +after the mountpoint has been successfully set up. +Units having the rclone ` + commandName + ` service specified as a requirement +will see all files and folders immediately in this mode. `, Run: func(command *cobra.Command, args []string) { cmd.CheckArgs(2, 2, command, args)