Here's a mistake that I've made more than once and that I'm going to try to get rid of by writing it down.
Systemd organizes running processes into a tree of, well, let's call them units for now (mechanically they're control groups), which partly manifests in the form of slice units . One of the big divisions in this hierarchy is between processes involved in services, which are put under
system.slice
, and user session processes, which are under
user.slice
. There are many situations where you would like to apply different settings to user processes than to system ones, partly because these processes are fundamentally different in several respects.
(For example, all services should normally have some way to explicitly stop them and this will normally do some sort of orderly shutdown of the service involved. User slices, sessions, and scopes have no such thing and thus no real concept of an 'orderly shutdown'; all you can do is hit them with various Unix signals until they go away. For user stuff, the orderly shutdown was generally supposed to happen when the user logged off.)
Systemd has two configuration files,
system.conf
and
user.conf
. One of the things
system.conf
can do is set global defaults for all units and all processes, both system processes (things under
system.slice
) and user processes (things under
user.slice
), for example
DefaultTimeoutStopSec
and
DefaultCPUAccounting
. As mentioned, there are plenty of times when you'd like to set or change these things only for user processes. You would think that systemd would provide a way to do this, and further if you're irritated with systemd and not paying close attention, you might think that
user.conf
can be used to set these things just for user processes. After all, surely systemd provides a way to do this obvious thing and 'user' is right there in the file's name. This is wrong .
What
user.conf
is for is covered in the manpage for both files ; it sets these values for systemd user instances , which are per-user systemd instances that the user can control and do things with. Systemd user instances can be used for interesting things (see the Arch wiki on them ), but I don't currently deal with any systems that use them actively so they're not on my mind much.
(Both Ubuntu 16.04 and Fedora 26 do start systemd user instances for people, but I don't think anyone on our systems uses them for anything; right now, they're just there.)
If systemd ever allows you to set things like
DefaultCPUAccounting
only for user processes, instead of globally, the place it might wind up is
logind.conf
, which configures
systemd-logind
, which is the systemd bit that actually sets up user slices, sessions, scopes, and so on (often in part through pam_systemd ). This seems a logical location to me because systemd-logind is where user stuff is controlled in general and
logind.conf
already has the
UserTasksMax
setting. I don't know if anything like this is being contemplated by the systemd people, though, and there are alternate approaches such as allowing
user-${UID}.slice
slices to be templated (although in the current setup, this would require renaming them to have an
@
in their name, eg
user@${UID}.slice
).
(I'm sure this seems like a silly mistake to make, and it certainly sounds like it when I've written it out like this. All I can say is that I've already made this mistake at least twice that I can remember; the most recent time made it into an irritated tweet that exhibited my misunderstanding .)