mirror of
https://github.com/arthur-pbty/arthur-os.git
synced 2026-08-01 20:28:16 +02:00
/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.
34 lines
1.1 KiB
Bash
Executable File
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
|