Package: systemd
Version: 252.3-2
Severity: normal

Hey.

What I do is about the following:

I log on via SSH to some node, and a "special" remote command starts a
VNC server as systemd --user service and upon certain signals it stops
it, while on HUP it just exits.
The idea is that in the HUP case one likely wants to keep the VNC
server running, so that it can be later re-connected to.

Now this works fine with e.g. SUSE's 246.16 systemd, but already fails
with the systemd in bullseye.

What seems to happen is that just a while after SSH's remote command
has exited, systemd kills off the whole --user session.

After googling a bit I found:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=825394
and already though that this would be what happens.

But as far as I understand the default was actually reverted to not
kill user processes, and that's also what loginctl show-seat shows.

My SSH remote commands looks like this:
Host VNC_example.org
        HostName                        example.org
        LocalForward                    localhost:51006 localhost:5903
        StreamLocalBindUnlink           yes
        ExitOnForwardFailure            yes
        ControlPath                     none
        RequestTTY                      force
        RemoteCommand                   displaynumber=3;
id="${LOGNAME}"; trap -- 'trap -- - EXIT INT TERM QUIT; exit 0' HUP;
trap -- 'exit 0' INT TERM QUIT; trap -- "systemctl --quiet --user
is-active \"tigervncserver@:\${displaynumber}_\${id}.service\"; [
\"\$?\" -ne 3 ]  &&  systemctl --user stop
\"tigervncserver@:\${displaynumber}_\${id}.service\"; exit 0" EXIT;
systemctl --quiet --user is-active
"tigervncserver@:${displaynumber}_${id}.service"  &&  printf '%%sVNC
server (`%%s`) already running and re-used.%%s\n' "$(tput setaf 6
2>/dev/null)" "tigervncserver@:${displaynumber}.service" "$(tput sgr0
2>/dev/null)" >&2  ||   { systemd-run --quiet --user --no-ask-password
--unit="tigervncserver@:${displaynumber}_${id}.service" --collect
--service-type=exec --working-directory="${HOME}" tigervncserver
":${displaynumber}" -fg  &&  printf '%%sVNC server (`%%s`)
started.%%s\n' "$(tput setaf 2 2>/dev/null)"
"tigervncserver@:${displaynumber}.service" "$(tput sgr0 2>/dev/null)"
>&2; }; while true; do sleep 6; systemctl --quiet --user is-active
"tigervncserver@:${displaynumber}_${id}.service"  ||  exit 0; done

A bit easier to read:
displaynumber='<n>';
vncserver_extra_options="";
unit_name_suffix="%C";
trap -- 'trap -- - EXIT INT TERM QUIT;
         exit 0'
     HUP;
trap -- 'exit 0' INT TERM QUIT;
trap -- "systemctl --quiet --user is-active
\"tigervncserver@:\${displaynumber}_\${unit_name_suffix}.service\";
         [ \"\$?\" -ne 3 ]  &&  systemctl --user stop
\"tigervncserver@:\${displaynumber}_\${unit_name_suffix}.service\";
         exit 0"
     EXIT;
systemctl --quiet --user is-active
"tigervncserver@:${displaynumber}_${unit_name_suffix}.service"  &&
printf '%%sVNC server (`%%s`) already running and re-used.%%s\n'
"$(tput setaf 6 2>/dev/null)"
"tigervncserver@:${displaynumber}.service" "$(tput sgr0 2>/dev/null)"
>&2  ||
{ systemd-run --quiet --user --no-ask-password
--unit="tigervncserver@:${displaynumber}_${unit_name_suffix}.service"
--collect --service-type=exec --working-directory="${HOME}"
tigervncserver ":${displaynumber}" -fg ${vncserver_extra_options}  &&
printf '%%sVNC server (`%%s`) started.%%s\n' "$(tput setaf 2
2>/dev/null)" "tigervncserver@:${displaynumber}.service" "$(tput sgr0
2>/dev/null)" >&2; };
while true; do
    sleep 60;
    systemctl --quiet --user is-active
"tigervncserver@:${displaynumber}_${unit_name_suffix}.service"  ||
exit 0;
done



journal log after the SSH disconnect (which I do via <newline>~. for a HUP):
Dec 22 03:01:33 example.org sshd[3409]: Received disconnect from
2003:... port 55458:11: disconnected by user
Dec 22 03:01:33 example.org sshd[3409]: Disconnected from user user
2003:... port 55458
Dec 22 03:01:33 example.org sshd[3386]: pam_unix(sshd:session):
session closed for user user
Dec 22 03:01:33 example.org systemd-logind[579]: Session 5 logged out.
Waiting for processes to exit.
Dec 22 03:01:36 example.org systemd[1]: session-5.scope: Deactivated
successfully.
Dec 22 03:01:36 example.org systemd-logind[579]: Removed session 5.
Dec 22 03:01:46 example.org systemd[1]: Stopping User Manager for UID 1000...
Dec 22 03:01:46 example.org systemd[3389]: Activating special unit
Exit the Session...
Dec 22 03:01:46 example.org systemd[3389]: Stopped target Main User Target.
Dec 22 03:01:46 example.org systemd[3389]: Stopping D-Bus User Message Bus...
Dec 22 03:01:46 example.org systemd[3389]: Stopping
/usr/bin/tigervncserver :3 -fg...
Dec 22 03:01:46 example.org systemd[3389]: Stopped D-Bus User Message Bus.
Dec 22 03:01:46 example.org systemd[3389]: Removed slice User Core
Session Slice.
Dec 22 03:01:46 example.org tigervncserver[3413]: Killing Xtigervnc
process ID 3428... success!
Dec 22 03:01:46 example.org systemd[3389]: Stopped
/usr/bin/tigervncserver :3 -fg.
Dec 22 03:01:46 example.org systemd[3389]:
tigervncserver@:3_user.service: Consumed 1.418s CPU time.
Dec 22 03:01:46 example.org systemd[3389]: Removed slice Slice
/app/tigervncserver.
Dec 22 03:01:46 example.org systemd[3389]: app-tigervncserver.slice:
Consumed 1.418s CPU time.
Dec 22 03:01:46 example.org systemd[3389]: Stopped target Basic System.
Dec 22 03:01:46 example.org systemd[3389]: Stopped target Paths.
Dec 22 03:01:46 example.org systemd[3389]: Stopped target Sockets.
Dec 22 03:01:46 example.org systemd[3389]: Stopped target Timers.
Dec 22 03:01:46 example.org systemd[3389]: Closed D-Bus User Message Bus Socket.
Dec 22 03:01:46 example.org systemd[3389]: Closed GnuPG network
certificate management daemon.
Dec 22 03:01:46 example.org systemd[3389]: Closed GnuPG cryptographic
agent and passphrase cache (access for web browsers).
Dec 22 03:01:46 example.org systemd[3389]: Closed GnuPG cryptographic
agent and passphrase cache (restricted).
Dec 22 03:01:46 example.org systemd[3389]: Closed GnuPG cryptographic
agent (ssh-agent emulation).
Dec 22 03:01:46 example.org systemd[3389]: Closed GnuPG cryptographic
agent and passphrase cache.
Dec 22 03:01:46 example.org systemd[3389]: Removed slice User Application Slice.
Dec 22 03:01:46 example.org systemd[3389]: app.slice: Consumed 1.425s CPU time.
Dec 22 03:01:46 example.org systemd[3389]: Reached target Shutdown.
Dec 22 03:01:46 example.org systemd[3389]: Finished Exit the Session.
Dec 22 03:01:46 example.org systemd[3389]: Reached target Exit the Session.
Dec 22 03:01:46 example.org systemd[1]: user@1000.service: Deactivated
successfully.
Dec 22 03:01:46 example.org systemd[1]: Stopped User Manager for UID 1000.
Dec 22 03:01:46 example.org systemd[1]: user@1000.service: Consumed
1.737s CPU time.
Dec 22 03:01:46 example.org systemd[1]: Stopping User Runtime
Directory /run/user/1000...
Dec 22 03:01:46 example.org systemd[1]: run-user-1000.mount:
Deactivated successfully.
Dec 22 03:01:46 example.org systemd[1]: user-runtime-dir@1000.service:
Deactivated successfully.
Dec 22 03:01:46 example.org systemd[1]: Stopped User Runtime Directory
/run/user/1000.
Dec 22 03:01:46 example.org systemd[1]: Removed slice User Slice of UID 1000.
Dec 22 03:01:46 example.org systemd[1]: user-1000.slice: Consumed
1.859s CPU time.

I've checked the signals received by the sshd processes and the shell
executing the command. Looks all good. Also the VNC server process
gets the TERM sig clearly by systemd.


Any idea why this doesn't work as expected (by me)?

Thanks,
Philippe

Reply via email to