Yes, this is a bodge. And yes, it should be unnecessary to jam in an inhibitor lock taken around the lifetime of an interactive shell permanently in the background.
The author wants xyr system to not suspend either when there's someone active on the GUI or when xe is logged in over the network. Theoretically, systemd already has a whole mechanism for making this happen.
The pam_systemd.so hook into PAM allows systemd-logind to track SSH sessions in its replacement for the Unix login database — all of that stuff under /run/systemd/users/, /run/systemd/seats/, and /run/systemd/sessions/. And in theory systemd-logind could respond negatively to a suspend request if there is an active SSH login session even if the GUI is idle.
In practice, it does not quite have the logic for achieving this. It's close, but it does not pass around enough information for this to be done as, say, a PolicyKit rule.
This has the same purpose as caffeinate command on Mac and will prevent the system from suspend while a command is running. This is useful with tmux or long compilations or tests or whatever.
On Linux I rather prefer to configure my laptop to never suspend when connected to a power supply. For me the compilations and tests heavily drain battery and should not be run typically on battery.
But it turned on Mac Apple really wants to suspend and configuring the same behavior is somewhat non-trivial. So in past when I used Mac i often had a terminal window running
caffeinate -i sleep infinity
to prevent any suspend until I hit Ctrl-C there.
mrtesthah 2 hours ago [-]
The underlying API is called Power Management Assertions.
debugnik 2 hours ago [-]
Something unclear about the explanation: systemd-inhibit is not running `sh & disown`, it's running `sh` and `& disown` applies to the systemd-inhibit command. If you actually daemonized the inner command, systemd-inhibit would release the lock immediately.
Cool trick though! I didn't know about systemd-inhibit.
zokier 7 hours ago [-]
I think this could be made into systemd (user) service fairly easily. Then you wouldn't need to worry about `disown` or tracking the PID, you'd just `systemctl --user start|stop prevent-sleep.service`
If you want to be extra fancy, you could even write small program that calls the dbus api directly and then just waits to be killed. Avoids the turducken of waiting processes.
blueflow 7 hours ago [-]
Of course systemd killing your SSH session is a intentional feature, not a bug.
Consider disabling suspend from the logind.conf and suspend, if at all, only at explicit user request.
jeroenhd 7 hours ago [-]
systemd doesn't kill your SSH session (if you'd WoL your PC there's a good chance you can continue typing unless your local terminal detects that the other end goes down).
It's more that when you configure systemd to suspend your computer when there is no physical activity, it will suspend your computer when there is no physical activity.
The author wants their computer to suspend automatically.
I think modifying your system configuration to never suspend is a much worse solution than using the tool designed to prevent suspending the computer while a specific program is running to prevent suspending the computer while that specific program is running.
It'd be easier if `sshd` would permit you to wrap the incoming command line/shells so `sshd` would spawn your session with systemd-inhibit, but I don't think that's possible?
blueflow 7 hours ago [-]
Unwarranted suspends by logind have always been a menace, i have been fighting them for a decade.
> It'd be easier if `sshd` would permit you to wrap the incoming command line/shells so `sshd` would spawn your session with systemd-inhibit, but I don't think that's possible?
sshd already links against systemd (by distro patches, not per upstream) but since SSH is a "legacy protocol" and its users are "uneducated troglodytes", this is not going to happen.
I think this is because OpenSSH is an OpenBSD project, and both systemd and OpenBSD refuse to support each other.
wmanley 5 hours ago [-]
> SSH is a "legacy protocol" and its users are "uneducated troglodytes",
Who are you quoting here?
bheadmaster 5 hours ago [-]
I assume that's a parody on systemd developers' attitude towards The Unix Way (TM).
I think the author’s point was that this is usually desired behaviour because it’s a desktop and only occasionally do they want to stop that.
heipei 4 hours ago [-]
Sounds complicated. I just use autossh from the CLI and it reconnects if my laptop (or the remote machine) wakes up again.
1970-01-01 6 hours ago [-]
Why not fix the keep alive time? Yes, there's no wrong way to do it, but IMHO the nix philosophy states you should at least try to stick your problem and your solution together.
What is the problem being solved? That your device is going to sleep or that it is interrupting SSH sessions? If it's the latter turn off keep-alives and an idle SSH session will live through sleeps and network interruptions.
1oooqooq 7 hours ago [-]
i think i used a laptop for a few hours in my life before I decided to simply disable all autosleep features.
computer is on, it's on. lid close, screen is off. done.
ajross 5 hours ago [-]
That's fine. In fact you're right that laptop and desktop power management is generally best done manually by expert users. That how I have things set up too, more often than not.
The use case for wakelocks (a longtime Android feature from which this is conceptually derived) is phones, though. Send a quick snap, throw it in your pocket, and expect (1) you get the notification for the reply when it arrives and (2) the device lasts until it gets back to the charger at bedtime.
That's highly non-trivial and absolutely not amenable to manual power management. Is systemd the right answer? Maybe not, but that's clearly where the feature is aimed.
The author wants xyr system to not suspend either when there's someone active on the GUI or when xe is logged in over the network. Theoretically, systemd already has a whole mechanism for making this happen.
The pam_systemd.so hook into PAM allows systemd-logind to track SSH sessions in its replacement for the Unix login database — all of that stuff under /run/systemd/users/, /run/systemd/seats/, and /run/systemd/sessions/. And in theory systemd-logind could respond negatively to a suspend request if there is an active SSH login session even if the GUI is idle.
In practice, it does not quite have the logic for achieving this. It's close, but it does not pass around enough information for this to be done as, say, a PolicyKit rule.
* https://github.com/systemd/systemd/blob/main/src/login/login...
* https://github.com/systemd/systemd/blob/main/src/login/login...
On Linux I rather prefer to configure my laptop to never suspend when connected to a power supply. For me the compilations and tests heavily drain battery and should not be run typically on battery.
But it turned on Mac Apple really wants to suspend and configuring the same behavior is somewhat non-trivial. So in past when I used Mac i often had a terminal window running
caffeinate -i sleep infinity
to prevent any suspend until I hit Ctrl-C there.
Cool trick though! I didn't know about systemd-inhibit.
If you want to be extra fancy, you could even write small program that calls the dbus api directly and then just waits to be killed. Avoids the turducken of waiting processes.
Consider disabling suspend from the logind.conf and suspend, if at all, only at explicit user request.
It's more that when you configure systemd to suspend your computer when there is no physical activity, it will suspend your computer when there is no physical activity.
The author wants their computer to suspend automatically.
I think modifying your system configuration to never suspend is a much worse solution than using the tool designed to prevent suspending the computer while a specific program is running to prevent suspending the computer while that specific program is running.
It'd be easier if `sshd` would permit you to wrap the incoming command line/shells so `sshd` would spawn your session with systemd-inhibit, but I don't think that's possible?
> It'd be easier if `sshd` would permit you to wrap the incoming command line/shells so `sshd` would spawn your session with systemd-inhibit, but I don't think that's possible?
sshd already links against systemd (by distro patches, not per upstream) but since SSH is a "legacy protocol" and its users are "uneducated troglodytes", this is not going to happen.
I think this is because OpenSSH is an OpenBSD project, and both systemd and OpenBSD refuse to support each other.
Who are you quoting here?
This github issue comes to mind:
https://github.com/tmux/tmux/issues/428
https://www.golinuxcloud.com/keep-alive-ssh-sessions-in-linu...
https://en.wikipedia.org/wiki/Keepalive
computer is on, it's on. lid close, screen is off. done.
The use case for wakelocks (a longtime Android feature from which this is conceptually derived) is phones, though. Send a quick snap, throw it in your pocket, and expect (1) you get the notification for the reply when it arrives and (2) the device lasts until it gets back to the charger at bedtime.
That's highly non-trivial and absolutely not amenable to manual power management. Is systemd the right answer? Maybe not, but that's clearly where the feature is aimed.