aboutsummaryrefslogtreecommitdiff
path: root/weed/command/fuse.go
diff options
context:
space:
mode:
authorWeihao Jiang <weihau.chiang@gmail.com>2025-05-23 00:50:07 +0800
committerGitHub <noreply@github.com>2025-05-22 09:50:07 -0700
commit874b4a553594e94b1b21f7f09c1c9a618a3fac78 (patch)
treeb721c2c06d4fdb76ec6ae26ae387671ab72eaab4 /weed/command/fuse.go
parent165af32d6b738daa14b84fb6e3c8891f4b46135b (diff)
downloadseaweedfs-874b4a553594e94b1b21f7f09c1c9a618a3fac78.tar.xz
seaweedfs-874b4a553594e94b1b21f7f09c1c9a618a3fac78.zip
Ensure `weed fuse` master process exits after mounted (#6809)
* Ensure fuse master process wait for mounted * Validate parent PID input in fuse command
Diffstat (limited to 'weed/command/fuse.go')
-rw-r--r--weed/command/fuse.go23
1 files changed, 21 insertions, 2 deletions
diff --git a/weed/command/fuse.go b/weed/command/fuse.go
index beed3349e..92ccf4673 100644
--- a/weed/command/fuse.go
+++ b/weed/command/fuse.go
@@ -2,9 +2,12 @@ package command
import (
"fmt"
+ "math"
"os"
+ "os/signal"
"strconv"
"strings"
+ "syscall"
"time"
)
@@ -105,6 +108,14 @@ func runFuse(cmd *Command, args []string) bool {
switch parameter.name {
case "child":
masterProcess = false
+ if parsed, err := strconv.ParseInt(parameter.value, 10, 64); err == nil {
+ if parsed > math.MaxInt || parsed <= 0 {
+ panic(fmt.Errorf("parent PID %s is invalid", err))
+ }
+ mountOptions.fuseCommandPid = int(parsed)
+ } else {
+ panic(fmt.Errorf("parent PID %s is invalid", err))
+ }
case "arg0":
mountOptions.dir = &parameter.value
case "filer":
@@ -211,7 +222,12 @@ func runFuse(cmd *Command, args []string) bool {
panic(err)
}
- argv := append(os.Args, "-o", "child")
+ // pass our PID to the child process
+ pid := os.Getpid()
+ argv := append(os.Args, "-o", "child="+strconv.Itoa(pid))
+
+ c := make(chan os.Signal, 1)
+ signal.Notify(c, syscall.SIGUSR1)
attr := os.ProcAttr{}
attr.Env = os.Environ()
@@ -228,7 +244,10 @@ func runFuse(cmd *Command, args []string) bool {
panic(fmt.Errorf("master process can not release child process: %s", err))
}
- return true
+ select {
+ case <-c:
+ return true
+ }
}
if fusermountPath != "" {