26

I run 16.04 and systemd now kills tmux when the user disconnects (summary of the change).

Is there a way to run tmux or screen (or any similar program) with systemd 230? I read all the heated disussion about pros and cons of the behavious but no solution was suggested.

(I see the behaviour in 229 as well)

2

6 Answers 6

21

The proper solution is to disable the offending systemd behavior system-wide.

Edit /etc/systemd/logind.conf (you must sudo, of course) and set

KillUserProcesses=no

You can also put this setting in a separate file, e.g. /etc/systemd/logind.conf.d/99-dont-kill-user-processes.conf.

Then restart systemd-logind.service.

sudo systemctl restart systemd-logind
4
  • 5
    How is the proper solution to a problem specific to one unit to set some system wide setting?
    – Julia Path
    Aug 13, 2017 at 18:37
  • Because, as you can see from even only reading the question, let alone all of the other discussion elsewhere about this that the question indirectly references, this is not specific to one application. This is a point that is even in boldface in the question.
    – JdeBP
    Aug 17, 2017 at 9:04
  • 2
    You just need to enable lingering for the user via loginctl enable-linger <user>. From man loginctl: "If enabled for a specific user, a user manager is spawned for the user at boot and kept around after logouts. This allows users who are not logged in to run long-running services." May 9, 2018 at 2:02
  • 2
    Ubuntu 18.04 here. This does not work, not even after reboot. Enabling lingering does not either.
    – Pa_
    Feb 13, 2019 at 12:29
15

Based on @Rinzwind's answer and inspired by a unit description the best I could find is to use TaaS (Tmux as a Service) - a generic detached instance of tmuxone reattaches to.

# cat /etc/systemd/system/[email protected]

[Unit]
Description=tmux default session (detached)
Documentation=man:tmux(1)

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/tmux new-session -d -s %I
ExecStop=/usr/bin/tmux kill-server
KillMode=none

[Install]
WantedBy=multiplexer.target

# systemctl start [email protected]
# systemctl start [email protected]
# tmux list-sessions

instanceone: 1 windows (created Sun Jul 24 00:52:15 2016) [193x49]
instancetwo: 1 windows (created Sun Jul 24 00:52:19 2016) [193x49]

# tmux attach-session -t instanceone

(instanceone)#
2
  • This is neat but I can't for the life of me figure out why you'd use it! :)
    – sarnold
    Dec 9, 2016 at 5:43
  • 9
    @sarnold: to be able to control applications which start with a console, but which are suppose to be running at boot time. Minecraft is one example.
    – WoJ
    Dec 9, 2016 at 11:59
7

RemainAfterExit=

Takes a boolean value that specifies whether the service shall be considered active even when all its processes exited. Defaults to no.

5
  • Thanks. I accepted and +1 your answer as it provides the core of the solution. Would you know if it is usable in an interactive mode (by launching tmux interactively, as opposed to my answer)?
    – WoJ
    Jul 24, 2016 at 6:59
  • doubt it. systemd probably will not care about your tmux unless you tell systemd it should :-P (their approach to this is rather single-minded.... it seems like it is their way or no way.) You need a unit description like you posted. Feel free to accept yours and/or expand yours ;-) I dont need the rep >:-D
    – Rinzwind
    Jul 24, 2016 at 7:06
  • 3
    This answer needs more detail such as where to use that setting.
    – kasperd
    Jul 24, 2016 at 8:50
  • 1
    Sure but the answer is going to be a copy/paste of the manual page ;-)
    – Rinzwind
    Jul 24, 2016 at 11:00
  • 1
    @WoJ You can make an alias for tmux to start as systemd-run --remain-after-exit tmux (or maybe even with --scope --user flags).
    – Debilski
    Aug 2, 2016 at 20:30
4

Using Ubuntu 18.04 with systemd version 237, none of the suggested solutions worked for me.

The solution that worked for me was to

  • edit the /etc/systemd/logind.conf
  • uncomment KillExlcudeUsers
  • add a space separated list of users (e.g., KillExlcudeUsers=root user1 user2)
4

According to https://unix.stackexchange.com/a/287282/117599 invoking tmux using

systemd-run --user --scope tmux

should also do the trick.

2
  • Unfortunately, this appears to no longer work in 18.10 cosmic.
    – taneli
    Jan 1, 2019 at 19:46
  • @taneli what doesn't work? Aug 4, 2020 at 20:25
4

You need to set the Type of the service to forking, as explained here.

Let's assume the service you want to run in screen is called minecraft. Then you would open minecraft.service in a text editor and add or edit the entry Type=forking under the section [Service].

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .