Jump to content

Systemd/User Services: Difference between revisions

From NixOS Wiki
Modified NixOS Search link to not specify channel=unstable. This way the default option for the website will be selected, which should usually be the latest default NixOS channel. Might be more in tune with user expectancy, as people using unstable are advanced enough to select the channel manually
Pigs (talk | contribs)
Add usage section
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Systemd/breadcrumb}}
<translate>
<!--T:1-->
Systemd supports running a separate instance of systemd for a given user, allowing the user to control their own services. See here for more information: https://wiki.archlinux.org/title/Systemd/User
Systemd supports running a separate instance of systemd for a given user, allowing the user to control their own services. See here for more information: https://wiki.archlinux.org/title/Systemd/User
 
</translate>
<translate>
<!--T:2-->
In NixOS, a user service can be expressed with {{ic|systemd.user.services.<name>}}, as documented here: https://search.nixos.org/options?query=systemd.user.services
In NixOS, a user service can be expressed with {{ic|systemd.user.services.<name>}}, as documented here: https://search.nixos.org/options?query=systemd.user.services
 
</translate>
<translate>
<!--T:3-->
This may be useful if you want a user to be able to start, stop, and restart their own instance of a service without needing to make the user a sudoer.
This may be useful if you want a user to be able to start, stop, and restart their own instance of a service without needing to make the user a sudoer.
 
</translate>
<translate>
<!--T:4-->
Here is an example:
Here is an example:
 
</translate>
<translate>
<!--T:5-->
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
systemd.user.services.my-cool-user-service = {
systemd.user.services.my-cool-user-service = {
Line 17: Line 29:
       ExecStart = ''/my/cool/user/service'';
       ExecStart = ''/my/cool/user/service'';
   };
   };
};
</syntaxhighlight>
</translate>
<translate>
<!--T:6-->
By default, user services will be stopped when the user logs out and will start again when the user logs back in due to us setting {{ic|<nowiki>wantedBy = [ "default.target" ]</nowiki>}} in the example.
</translate>
<translate>
== Keeping user services running after logout == <!--T:7-->
</translate>
<translate>
<!--T:8-->
If you need a user service to stay running after a user logs out, you need to enable "[https://search.nixos.org/options?channel=unstable&show=users.users.%3Cname%3E.linger&from=0&size=50&sort=relevance&type=packages&query=users.users.%3Cname%3E.linger lingering]" by setting {{ic|<nowiki>users.users.<username>.linger = true;</nowiki>}}
</translate>
<translate>
<!--T:9-->
You'll also likely want to change to {{ic|<nowiki>wantedBy = [ "multi-user.target" ];</nowiki>}} so the service starts at boot time.
</translate>
== Enabling a service for specific users ==
By default, enabling a user service enables it for every user for which systemd spawns a service manager. If you wish for the service to be run only for specific users (say, {{ic|<nowiki>UserA</nowiki>}} and {{ic|<nowiki>UserB</nowiki>}}), use {{ic|<nowiki>ConditionUser</nowiki>}} ({{ic|<nowiki>man 5 systemd.unit</nowiki>}}):
<syntaxhighlight lang="nix">
systemd.user.services.my-cool-user-service = {
  unitConfig.ConditionUser = "UserA|UserB";
};
};
</syntaxhighlight>
</syntaxhighlight>


By default, user services will be stopped when the user logs out and will start again when the user logs back in due to us setting {{ic|<nowiki>wantedBy = [ "default.target" ]</nowiki>}} in the example.
Likewise, you can also disable a service for a specific user:
 
<syntaxhighlight lang="nix">
systemd.user.services.my-cool-user-service = {
  unitConfig.ConditionUser = "!root";
};
</syntaxhighlight>
 
== Usage ==
 
To interact with user-specific systemd services, use the <code>--user</code> flag with the <code>systemctl</code> command. For example, to check the status of a user service:
<syntaxhighlight lang="console"> $ systemctl --user status my-cool-user-service </syntaxhighlight>


== Keeping user services running after logout ==
To view logs for a specific user service, use <code>journalctl</code> with the <code>--user-unit</code> option:
<syntaxhighlight lang="console"> $ journalctl --user-unit my-cool-user-service </syntaxhighlight>


If you need a user service to stay running after a user logs out, you need to enable "[https://search.nixos.org/options?channel=unstable&show=users.users.%3Cname%3E.linger&from=0&size=50&sort=relevance&type=packages&query=users.users.%3Cname%3E.linger lingering]" by setting {{ic|<nowiki>users.users.<username>.linger = true;</nowiki>}}
To list all active user units:
<syntaxhighlight lang="console"> $ systemctl --user list-units </syntaxhighlight>  


You'll also likely want to change to {{ic|<nowiki>wantedBy = [ "multi-user.target" ];</nowiki>}} so the service starts at boot time.
[[Category:systemd]]
[[Category:systemd]]

Latest revision as of 18:14, 22 May 2025

Systemd supports running a separate instance of systemd for a given user, allowing the user to control their own services. See here for more information: https://wiki.archlinux.org/title/Systemd/User In NixOS, a user service can be expressed with systemd.user.services.<name>, as documented here: https://search.nixos.org/options?query=systemd.user.services This may be useful if you want a user to be able to start, stop, and restart their own instance of a service without needing to make the user a sudoer. Here is an example:

systemd.user.services.my-cool-user-service = {
  enable = true;
  after = [ "network.target" ];
  wantedBy = [ "default.target" ];
  description = "My Cool User Service";
  serviceConfig = {
      Type = "simple";
      ExecStart = ''/my/cool/user/service'';
  };
};

By default, user services will be stopped when the user logs out and will start again when the user logs back in due to us setting wantedBy = [ "default.target" ] in the example.

Keeping user services running after logout

If you need a user service to stay running after a user logs out, you need to enable "lingering" by setting users.users.<username>.linger = true; You'll also likely want to change to wantedBy = [ "multi-user.target" ]; so the service starts at boot time.

Enabling a service for specific users

By default, enabling a user service enables it for every user for which systemd spawns a service manager. If you wish for the service to be run only for specific users (say, UserA and UserB), use ConditionUser (man 5 systemd.unit):

systemd.user.services.my-cool-user-service = {
  unitConfig.ConditionUser = "UserA|UserB";
};

Likewise, you can also disable a service for a specific user:

systemd.user.services.my-cool-user-service = {
  unitConfig.ConditionUser = "!root";
};

Usage

To interact with user-specific systemd services, use the --user flag with the systemctl command. For example, to check the status of a user service:

 $ systemctl --user status my-cool-user-service

To view logs for a specific user service, use journalctl with the --user-unit option:

 $ journalctl --user-unit my-cool-user-service

To list all active user units:

 $ systemctl --user list-units