Files
arthur-os/default/systemd/system-sleep/unmount-fuse
T
Alan Sikora cce8d878ec Decode octal-escaped mountpoints and disown backgrounded restart
/proc/mounts uses octal escaping for special characters (e.g. \040 for
spaces). Decode with printf before passing to fusermount so paths with
spaces are handled correctly.

Add disown after backgrounding the gvfs restart so it survives
systemd-sleep's cgroup cleanup when the hook script exits.
2026-03-08 23:42:01 -03:00

34 lines
1.1 KiB
Bash
Executable File

#!/bin/bash
# Lazy-unmount all FUSE filesystems before suspend/hibernate to prevent the
# kernel's process freeze from timing out. FUSE daemons (like gvfsd-fuse from
# Nautilus) can block in uninterruptible sleep during freeze, causing suspend
# to silently fail. After wake, restart gvfs so the FUSE mount is restored.
if [[ $1 == "pre" ]]; then
while IFS=' ' read -r _ mountpoint fstype _; do
if [[ $fstype == fuse.* ]]; then
mountpoint=$(printf '%b' "$mountpoint")
fusermount3 -uz "$mountpoint" 2>/dev/null || fusermount -uz "$mountpoint" 2>/dev/null || true
fi
done < /proc/mounts
fi
if [[ $1 == "post" ]]; then
# Run in background — user.slice is still frozen at this point, so a
# synchronous restart would block the thaw for up to 90 seconds.
(
sleep 5
for uid_dir in /run/user/*; do
uid=$(basename "$uid_dir")
if [[ -S $uid_dir/bus ]]; then
sudo -u "#$uid" \
DBUS_SESSION_BUS_ADDRESS="unix:path=$uid_dir/bus" \
XDG_RUNTIME_DIR="$uid_dir" \
systemctl --user restart gvfs-daemon.service 2>/dev/null || true
fi
done
) &
disown
fi