Preventing Sleep on Debian When Network Connections Are Active
When running remote servers or SSH-accessible systems, you don’t want your linux (Debian) machine to suspend while you’re connected or performing remote tasks. This approach blocks system suspend whenever an SSH session is open — without requiring root, sudo, or system-wide configuration.
It is designed for:
- Headless servers
- Homelab nodes
- Remote-admin systems
What This Does
When you log in via SSH:
A background process registers a sleep inhibitor with
systemd-logindThe inhibitor remains active for the lifetime of the SSH session
While the inhibitor is active:
- Idle suspend is prevented
- Manual suspend requests are delayed/refused
When the SSH session ends:
- The inhibitor exits automatically
- Suspend behavior returns to normal
1. Set Polkit policy to skip authentication requirement
By default, using systemd-inhibit --mode=block requires authentication. This is a frustrating experience and can conflict with other on-login hooks (like neofetch/fastfetch) in interactive shells. We can set a policy to skip the authentication requirement specifically for specific actions associated with ssh-inhibit.
Create policy
sudo nano /etc/polkit-1/rules.d/49-ssh-inhibit.rulesPaste the rule definition
polkit.addRule(function(action, subject) { if ( subject.active === true && subject.isInGroup("ssh-inhibit") && ( action.id === "org.freedesktop.login1.inhibit-block-sleep" || action.id === "org.freedesktop.login1.inhibit-delay-sleep" || action.id === "org.freedesktop.login1.inhibit-block-idle" ) ) { return polkit.Result.YES; } });Apply the rule
sudo chown root:root /etc/polkit-1/rules.d/49-ssh-inhibit.rules sudo chmod 644 /etc/polkit-1/rules.d/49-ssh-inhibit.rules sudo systemctl restart polkit
2. Add the SSH login hook to inhibit sleep
Edit
/etc/ssh/sshrcsudo nano /etc/ssh/sshrcAdd this block near the end:
# Prevent sleep while SSH session is active systemd-inhibit \ --what=sleep \ --mode=block \ --who="SSH session" \ --why="Active SSH connection" \ sleep infinity \ </dev/null >/dev/null 2>&1 &This inhibits sleep during an SSH connection by blocking sleep:
sleep infinityKeeps the inhibitor alive for the duration of the session</dev/nullPrevents interactive authentication prompts>/dev/null 2>&1Keeps SSH login output clean (no banner interference)&Runs in the background so login continues normally
3. Verify active inhibitors
SSH into your Debian host (or log out & log in)
Run:
systemd-inhibit --list
Check for SSH session ... systemd-inhibit. Example output:
WHO UID USER PID COMM WHAT WHY >
ModemManager 0 root 1365 ModemManager sleep ModemManager n>
NetworkManager 0 root 1251 NetworkManager sleep NetworkManager>
UPower 0 root 1642 upowerd sleep Pause device p>
GNOME Shell 1000 <USER> 2173 gnome-shell sleep GNOME needs to>
SSH session 1000 <USER> 5214 systemd-inhibit sleep Active SSH con>
...That confirms your SSH inhibitor is active.
4. Test the inhibitor
Try to suspend manually:
systemctl suspendYou should see something like:
Operation inhibited by "systemd-inhibit (SSH session)"