After removing an ESXi storage, a zombie process is generated because the forked FUSE process (esxi-folder-fuse) is not properly reaped.
This patch implements a double-fork mechanism to ensure the FUSE process is reparented to init (PID 1), which will properly reap it when it exits. Additionally adds the missing waitpid() call to reap the intermediate child process. Tested on Proxmox VE 8.4.1 with ESXi 8.0U3e storage. Signed-off-by: Stelios Vailakakis <stel...@libvirt.dev> --- src/PVE/Storage/ESXiPlugin.pm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/PVE/Storage/ESXiPlugin.pm b/src/PVE/Storage/ESXiPlugin.pm index ab5242d..7c2d16a 100644 --- a/src/PVE/Storage/ESXiPlugin.pm +++ b/src/PVE/Storage/ESXiPlugin.pm @@ -211,7 +211,17 @@ sub esxi_mount : prototype($$$;$) { if (!$pid) { eval { undef $rd; - POSIX::setsid(); + + # Double fork to properly daemonize + POSIX::setsid() or die "failed to create new session: $!\n"; + my $pid2 = fork(); + die "second fork failed: $!\n" if !defined($pid2); + + if ($pid2) { + # First child exits immediately + POSIX::_exit(0); + } + # Second child (grandchild) enters systemd scope PVE::Systemd::enter_systemd_scope( $scope_name_base, "Proxmox VE FUSE mount for ESXi storage $storeid (server $host)", @@ -243,6 +253,8 @@ sub esxi_mount : prototype($$$;$) { } POSIX::_exit(1); } + # Parent wait for first child to exit + waitpid($pid, 0); undef $wr; my $result = do { local $/ = undef; <$rd> }; -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel