[pve-devel] [PATCH storage] fix #6073: esxi: fix zombie process after storage removal
Stelios Vailakakis
stelios at libvirt.dev
Tue Jul 1 17:41:35 CEST 2025
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 <stelios at 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
More information about the pve-devel
mailing list