forked from TrueCloudLab/rclone
mount: run rclone mount in the background - fixes #723
This commit is contained in:
parent
90af7af9a3
commit
ebfeec9fb4
4 changed files with 68 additions and 4 deletions
15
cmd/mountlib/daemon.go
Normal file
15
cmd/mountlib/daemon.go
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// Daemonization interface for non-Unix variants only
|
||||||
|
|
||||||
|
// +build windows darwin,!cgo
|
||||||
|
|
||||||
|
package mountlib
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func startBackgroundMode() bool {
|
||||||
|
log.Fatalf("background mode not supported on %s platform", runtime.GOOS)
|
||||||
|
return false
|
||||||
|
}
|
32
cmd/mountlib/daemon_unix.go
Normal file
32
cmd/mountlib/daemon_unix.go
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
// Daemonization interface for Unix variants only
|
||||||
|
|
||||||
|
// +build !windows
|
||||||
|
// +build !darwin cgo
|
||||||
|
|
||||||
|
package mountlib
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/sevlyar/go-daemon"
|
||||||
|
)
|
||||||
|
|
||||||
|
func startBackgroundMode() bool {
|
||||||
|
cntxt := &daemon.Context{}
|
||||||
|
d, err := cntxt.Reborn()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if d != nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err := cntxt.Release(); err != nil {
|
||||||
|
log.Printf("error encountered while killing daemon: %v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
|
@ -23,6 +23,7 @@ var (
|
||||||
AllowOther = false
|
AllowOther = false
|
||||||
DefaultPermissions = false
|
DefaultPermissions = false
|
||||||
WritebackCache = false
|
WritebackCache = false
|
||||||
|
Daemon = false
|
||||||
MaxReadAhead fs.SizeSuffix = 128 * 1024
|
MaxReadAhead fs.SizeSuffix = 128 * 1024
|
||||||
ExtraOptions []string
|
ExtraOptions []string
|
||||||
ExtraFlags []string
|
ExtraFlags []string
|
||||||
|
@ -174,6 +175,14 @@ will see all files and folders immediately in this mode.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start background task if --background is specified
|
||||||
|
if Daemon {
|
||||||
|
daemonized := startBackgroundMode()
|
||||||
|
if daemonized {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
err := Mount(fdst, args[1])
|
err := Mount(fdst, args[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Fatal error: %v", err)
|
log.Fatalf("Fatal error: %v", err)
|
||||||
|
@ -196,7 +205,7 @@ will see all files and folders immediately in this mode.
|
||||||
flags.FVarP(flagSet, &MaxReadAhead, "max-read-ahead", "", "The number of bytes that can be prefetched for sequential reads.")
|
flags.FVarP(flagSet, &MaxReadAhead, "max-read-ahead", "", "The number of bytes that can be prefetched for sequential reads.")
|
||||||
flags.StringArrayVarP(flagSet, &ExtraOptions, "option", "o", []string{}, "Option for libfuse/WinFsp. Repeat if required.")
|
flags.StringArrayVarP(flagSet, &ExtraOptions, "option", "o", []string{}, "Option for libfuse/WinFsp. Repeat if required.")
|
||||||
flags.StringArrayVarP(flagSet, &ExtraFlags, "fuse-flag", "", []string{}, "Flags or arguments to be passed direct to libfuse/WinFsp. Repeat if required.")
|
flags.StringArrayVarP(flagSet, &ExtraFlags, "fuse-flag", "", []string{}, "Flags or arguments to be passed direct to libfuse/WinFsp. Repeat if required.")
|
||||||
//flags.BoolVarP(flagSet, &foreground, "foreground", "", foreground, "Do not detach.")
|
flags.BoolVarP(flagSet, &Daemon, "daemon", "", Daemon, "Run mount as a daemon (background mode).")
|
||||||
|
|
||||||
// Add in the generic flags
|
// Add in the generic flags
|
||||||
vfsflags.AddFlags(flagSet)
|
vfsflags.AddFlags(flagSet)
|
||||||
|
|
|
@ -20,6 +20,11 @@ This is **EXPERIMENTAL** - use with care.
|
||||||
|
|
||||||
First set up your remote using `rclone config`. Check it works with `rclone ls` etc.
|
First set up your remote using `rclone config`. Check it works with `rclone ls` etc.
|
||||||
|
|
||||||
|
You can either run mount in foreground mode or background(daemon) mode. Mount runs in
|
||||||
|
foreground mode by default, use the `--daemon` flag to specify background mode mode.
|
||||||
|
Background mode is only supported on Linux and OSX, you can only run mount in
|
||||||
|
foreground mode on Windows.
|
||||||
|
|
||||||
Start the mount like this
|
Start the mount like this
|
||||||
|
|
||||||
rclone mount remote:path/to/files /path/to/local/mount
|
rclone mount remote:path/to/files /path/to/local/mount
|
||||||
|
@ -28,12 +33,15 @@ Or on Windows like this where X: is an unused drive letter
|
||||||
|
|
||||||
rclone mount remote:path/to/files X:
|
rclone mount remote:path/to/files X:
|
||||||
|
|
||||||
When the program ends, either via Ctrl+C or receiving a SIGINT or SIGTERM signal,
|
When running in background mode the user will have to stop the mount manually (specified below).
|
||||||
the mount is automatically stopped.
|
|
||||||
|
When the program ends while in foreground mode, either via Ctrl+C or receiving
|
||||||
|
a SIGINT or SIGTERM signal, the mount is automatically stopped.
|
||||||
|
|
||||||
The umount operation can fail, for example when the mountpoint is busy.
|
The umount operation can fail, for example when the mountpoint is busy.
|
||||||
When that happens, it is the user's responsibility to stop the mount manually with
|
When that happens, it is the user's responsibility to stop the mount manually.
|
||||||
|
|
||||||
|
Stopping the mount manually:
|
||||||
# Linux
|
# Linux
|
||||||
fusermount -u /path/to/local/mount
|
fusermount -u /path/to/local/mount
|
||||||
# OS X
|
# OS X
|
||||||
|
|
Loading…
Reference in a new issue