Question Comment faire fonctionner mon service systemd via un utilisateur spécifique et démarrer au démarrage?


Je viens de mettre à jour le serveur Ubuntu 14 à la version 15. J'ai eu du mal à faire fonctionner mon script de démarrage 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, s'il vous plaît :-)

Voici ce que mon script de démarrage é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 page wiki de systemd, J'ai utilisé les tableaux fournis pour cartographier les choses aussi étroitement 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 est situé à /home/robert/.config/systemd/user/nzbget.service. Pour démarrer le service manuellement, je fais:

$ 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 un service novateur: je veux qu'il démarre au démarrage, soit exécuté en permanence et en tant qu'utilisateur spécifique.

Que dois-je faire pour avoir cette configuration?


85
2017-09-19 16:17


origine




Réponses:


Premier problème

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

Deuxième problème

Pour que le service s'exécute 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 destiné à être utilisé par l'administrateur système (c'est-à-dire vous) pour ajouter de nouveaux services à l'échelle du système.

Les autres dossiers incluent:

  • /usr/lib/systemd/system/ est destiné aux paquets qui veulent installer des fichiers unitaires, mais sous Debian et Ubuntu, le dossier est en fait /lib/systemd/system/ parce que les divers bin et lib les dossiers n'ont pas été fusionnés en un /usr/ préfixe encore.
  • /usr/local/systemd/system/ est pour installer des unités par paquets compilés localement.

Test de l'unité

Une fois que le fichier d'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. Il devrait fonctionner sans avoir à taper le chemin complet de l'unité. L’extension n’a pas non plus besoin d’être spécifiée si .service.

Activation de l'unité

Avant de pouvoir activer votre appareil, vous devez ajouter un [Install] section, sous laquelle vous devez ajouter la directive WantedBy=multi-user.target. Cette directive spécifie la phase du processus de démarrage au cours de laquelle le service doit être démarré (s’il était activé). multi-user.target est approprié pour la plupart des services.

Une fois cette information ajoutée, vous pouvez utiliser systemctl enable <UNIT_FILENAME>, qui active l’unité, ce qui permet à systemd de le démarrer automatiquement lors du démarrage à l’étape spécifiée.


102
2017-09-19 16:51



Cela a fonctionné. Je devais spécifier le chemin absolu vers le nom de fichier du service dans le systemctl enablecommande cependant, cela n'était pas évident pour moi au début. Permettre aussi m'a donné un avertissement au sujet d'un manque [Install] section. Je l'ai ignoré, mais je ne suis pas sûr que cela puisse affecter sa capacité à démarrer au démarrage. - void.pointer
le Install l'avertissement était vraiment très important. Il ne démarrera pas au démarrage sans WantedBy=multi-user.target sous le [Install] section. Après avoir ajouté ceci à la .service fichier, puis vous pouvez enable il. - void.pointer
Je m'excuse de laisser la réponse sans surveillance pendant si longtemps. J'ai corrigé l'emplacement où le fichier d'unité devrait aller, ajouté les informations manquantes sur le fichier. [Install] section. J'espère que c'est maintenant plus utile pour ceux qui le recherchent. - Yamaho
Cela devient beaucoup plus facile lorsque le nom d'utilisateur est basé sur un modèle, c'est-à-dire que votre service est défini avec un nom de fichier au format something@.service puis enabled aime something@username.service le réglage devient User=%i ce qui signifie que l'utilisateur n'est pas codé en dur et que plusieurs utilisateurs peuvent utiliser la même définition. Un exemple. - Walf
Est-ce que ça va commencer si je le mets sous /etc/systemd/user/ ? - Khurshid Alam


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

Un gestionnaire de services distinct pour l’utilisateur correspondant est démarré au démarrage, vos unités définies par l’utilisateur dans ~/.config/systemd/user seront récupérés et traités aux heures de démarrage et d'arrêt en fonction de votre configuration de service.

Vous pouvez aussi utiliser systemctl --user pour gérer et configurer le ou les services, qui fonctionneront sur le gestionnaire de services de votre utilisateur et non sur celui du système.


30
2017-12-11 20:28



systemctl --user est une découverte fantastique. Merci! - Anwar
@byteborg Peut-être que vous pouvez contribuer à unix.stackexchange.com/questions/409900/…? J'ai besoin de la dépendance sur PostgreSQL dans le service de suivi des utilisateurs, mais la base de données reste un service système, pas un utilisateur. - Michał F
Une fois que les services sont en cours d'exécution, existe-t-il des techniques permettant à l'utilisateur de consulter les journaux du service? Un utilisateur non privilégié ne pourrait pas accéder à / var / log / syslog. - mpr
Notez que systemctl --user ne semble pas fonctionner pour les sessions SSH cependant. - Mark K Cowan
@MarkKCowan, vous devez vous assurer que vous pouvez l'exécuter. Dans certains cas, vous pourriez avoir l'erreur systemd[29239]: PAM unable to dlopen(pam_systemd.so): /lib/security/pam_systemd.so: cannot open shared object file: No such file or directory et PAM adding faulty module: pam_systemd.so en faisant systemctl start user@$USER.service dans ce cas, installez simplement libpam-systemd et vous aurez ce travail et commencer au démarrage - Treviño