Letting screen and tmux survive a logout under, and attaching processes to systemd scopes
I'm not exactly sure since when, but for a while I had had a new behavior: logging out from a session that has some
screen or tmux sessions launched will terminate those too, which beats one of the purposes of running stuff in them.
There is a workaround, which you can find everywhere:
loginctl enable-linger $USER systemd-run --scope --user screen
This is good for launching new sessions, but what if you already have a session running, you're out of luck.
Or are you?
Unluckily systemd does not have a nice way to do this. But it is still possible.
We can create a new scope and attach the screen master later:
systemd-run --scope --user sleep infinity # Running as unit: run-p1787326-i1787327.scope; invocation ID: ed6adac8a0db4e8f9e9ce59731cc2aa5
We use infinity so the scope does not finish before we can attach to it. Now let's find the control group under which
it's running:
systemctl --user show -P ControlGroup run-p1787326-i1787327.scope # /user.slice/user-1000.slice/user@1000.service/app.slice/run-p1787326-i1787327.scope
This references a scope directory in the /sys/fs/cgroup/ directory. We need to add the PID of the screen to the
cgroup.procs file in it:
echo 1789758 > /sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/run-p1787326-i1787327.scope/cgroup.procs
Thanks to grawity#systemd@libera.chat.