web-dev-qa-db-fra.com

Comment faire en sorte que mon service systemd s'exécute via un utilisateur spécifique et démarre au démarrage?

Je viens de mettre à niveau la version 15 du serveur Ubuntu 14 vers la version 15. J'ai eu du mal à faire fonctionner mon script d'installation après la mise à niveau et j'ai lu que systemd était la nouvelle valeur par défaut. Je suis loin d'être un expert linux, alors allez-y doucement sur moi :-)

Voici ce que mon script parvenu était avant:

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script

Basé sur le version récente de la page wiki de systemd , j’ai utilisé les tables fournies pour mapper les éléments aussi fidèlement que possible dans mon nouveau fichier de service systemd:

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

Ce fichier se trouve à /home/robert/.config/systemd/user/nzbget.service. Pour démarrer le service manuellement, je faisais:

$ systemctl --user start nzbget

Cela fonctionne très bien. Cependant, lorsque je me déconnecte de ma session SSH, le service s'arrête. En outre, il ne démarre pas au démarrage ou lors de la connexion de l'utilisateur. Je veux qu'il se comporte comme s'il s'agissait d'un service upstart: je veux qu'il démarre au démarrage, qu'il soit exécuté en permanence et en tant qu'utilisateur spécifique.

Que dois-je faire pour obtenir cette configuration?

118
void.pointer

Premier problème

Vous pouvez spécifier les directives User= et Group= dans la section [Service] du fichier d'unité.

Deuxième problème

Pour que le service fonctionne au démarrage, vous ne devez pas le placer dans votre dossier personnel. Au lieu de cela, mettez-le sous /etc/systemd/system/. C’est le dossier que l’administrateur système (c’est-à-dire vous) doit utiliser pour ajouter de nouveaux services à l’échelle du système.

Les autres dossiers incluent:

  • /usr/lib/systemd/system/ est destiné aux paquets qui souhaitent installer des fichiers unités, bien que sous Debian et Ubuntu, le dossier est en fait /lib/systemd/system/ car les différents dossiers bin et lib n'ont pas encore été fusionnés dans un préfixe unifié /usr/.
  • /usr/local/systemd/system/ permet d'installer des unités avec des packages compilés localement.

Tester l'unité

Une fois que le fichier de l'unité est dans un emplacement approprié, vous pouvez essayer de démarrer l'unité immédiatement en tapant systemctl start <UNIT_FILENAME> comme d'habitude. Cela devrait fonctionner sans avoir à taper le chemin complet de l'unité. L'extension n'a pas non plus besoin d'être spécifiée s'il s'agit de .service.

Activer l'unité

Avant de pouvoir activer votre unité, vous devez ajouter une section [Install], dans laquelle vous devez ajouter la directive WantedBy=multi-user.target. Cette directive spécifie l'étape du processus de démarrage au cours de laquelle le service doit être démarré (s'il était activé). multi-user.target convient à la plupart des services.

Une fois ces informations ajoutées, vous pouvez utiliser systemctl enable <UNIT_FILENAME>, qui active l'unité et oblige désormais systemd à la démarrer automatiquement lors du démarrage à l'étape spécifiée.

146
Yamaho

Vous pourriez être intéressé par l’utilisation de la fonctionnalité "utilisateur en attente" de systemd. Il est activé via loginctl enable-linger USERNAME.

Cela entraîne le démarrage d'un gestionnaire de services distinct pour l'utilisateur respectif au démarrage. Ainsi, vos unités définies par l'utilisateur dans ~/.config/systemd/user seront récupérées et traitées aux heures de démarrage et d'arrêt en fonction de la configuration de votre service.

Vous pouvez également utiliser systemctl --user pour gérer et configurer le (s) service (s), qui fonctionneront sur le gestionnaire de services de votre utilisateur, et non sur celui du système.

41
byteborg