Systemd/Пользовательские сервисы
Systemd поддерживает запуск отдельного экземпляра systemd для конкретного пользователя, позволяя ему управлять своими собственными службами.
В NixOS пользовательский сервис может быть выражен с помощью systemd.user.services.<name>, как описано здесь: https://search.nixos.org/options?query=systemd.user.services.
Это может быть полезно, если вы хотите, чтобы пользователь мог запускать, останавливать и перезапускать свой собственный экземпляр службы без необходимости делать его sudoer.
Пример сервиса:
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'';
};
};
По умолчанию пользовательские сервисы будут остановлены, когда пользователь выйдет из системы, и запустятся снова, когда пользователь снова войдет в систему, благодаря тому, что мы установили wantedBy = ["default.target" ] в примере.
Продолжение работы пользовательских служб после выхода из системы
Если вам нужно, чтобы пользовательский сервис продолжал работать после выхода пользователя из системы, вам нужно включить "lingering", установив users.users.<username>.linger = true;.
Вы также, вероятно, захотите изменить wantedBy = ["multi-user.target" ];, чтобы служба запускалась во время загрузки.
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