Comment démarrer un service systemd après la connexion de l'utilisateur et l'arrêter avant la déconnexion de l'utilisateur

10

J'ai une machine Fedora 23.

J'ai un script bash de synchronisation de répertoire / fichier qui synchronise mon répertoire local / home avec un répertoire distant (sur une machine NAS). Je l'exécute manuellement mais je voudrais créer un service systemd et le rendre plus flexible, car d'autres personnes utilisent mon PC avec leurs propres informations d'identification d'utilisateur, je voudrais savoir quand un utilisateur est connecté et démarrer mon service par la suite.

Puis-je faire quelque chose à partir du fichier systemd de mon service ou devrai-je vérifier cela à partir de mon code dans le script?

Je dois seulement m'assurer d'avoir accès aux variables d'environnement (comme $ USER) et l'exécuter en tant que service.

Ma principale source de documentation est ce lien https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html

GeorgeKaf
la source
Est -ce que le systemctl --usertravail sur F23?
user1686
Je suppose que oui, il renvoie une liste et un message 76 loaded units listed.
GeorgeKaf
Voici une autre approche qui pourrait fonctionner pour vous: unix.stackexchange.com/a/109270/111707 Écrivez un petit script Python que vous lancez .bashrcà la connexion, puis il écoute le signal de déconnexion de Gnome et s'arrête.
IanB
@IanB Merci, je vais le tester. Cela ne fait jamais de mal d'avoir quelque chose comme ça autour.
GeorgeKaf

Réponses:

15

Utilisez systemd, il inclut déjà la prise en charge des sessions utilisateur, en fait, vous devriez déjà en dépendre (sans le savoir).

Créer le répertoire des services

mkdir -p $HOME/.local/share/systemd/user

Créer éditer un fichier de service (vim, gedit, geany - tout ce que vous voulez)

vim $HOME/.local/share/systemd/user/my.service

Cela devrait à peu près ressembler à ceci, s'il s'agit d'un service permanent.

[Unit]
Description=My very own Service
[Service]
Type=simple
TimeoutStartSec=0
ExecStart=/path/to/start/script arguments
[Install]
WantedBy=default.target

Mais il semble que vous souhaitiez plutôt le déclencher une fois, alors soyez bon avec lui, alors utilisez plutôt une configuration one-shot comme celle-ci:

[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/path/to/start/script arguments
ExecStop=/path/to/stop/script arguments
[Install]
WantedBy=default.target

Cela suppose bien sûr que votre script soit exécutable, c'est-à-dire:

chmod a+x /path/to/start/script
chmod a+x /path/to/stop/script

Sinon, vous devrez ajouter le chemin d'accès à l'interpréteur respectif:

ExecStart=/bin/bash /path/to/start/script arguments

Rechargez maintenant systemd (et reconnectez-vous pour des raisons de test)

systemctl --user enable my.service # enables the service
systemctl --user # should display your new unit in the list
journalctl --user should show the log

Si vous avez besoin de plus d'informations, reportez-vous à l' Arch-Wiki par exemple. Ce fil askubuntu a diverses idées, y compris d'ailleurs la mienne.

Vous pouvez étendre le comportement (si vous êtes root) à d'autres utilisateurs en définissant le service globalement. Pour ce faire, vous devez créer le fichier de service dans / usr / share / systemd / user / pas dans $ HOME / .local / share / systemd / user .

anx
la source
1
salut, la réponse était bonne. Mais cela ne fonctionnera que si le service doit être démarré lors de la première connexion et arrêté lors de la dernière session utilisateur.
Anwar
4
Vous avez besoin de l'indicateur --user lorsque vous activez le service. "systemctl --user enable my.service"
blushrt
0

Je le sais depuis quelques années, mais la réponse d'Anx m'a juste aidé. Donc, je suppose que c'est toujours pertinent. De plus, c'est plus un commentaire, mais je n'ai pas ce privilège donc je le poste comme une "réponse". À tout prix...

Sous Linux Mint 19, je ne pouvais pas "activer" le service lorsque le script se trouvait dans '$ HOME / .local / share / systemd / user'. Tenter de le faire entraînait toujours une erreur. Je pourrais cependant le démarrer très bien à partir du répertoire '$ HOME / .local / share / systemd / user'. Après avoir déplacé le script dans '/ usr / share / systemd / user /', systemd m'a permis de l'activer sans problème.

notorious.dds
la source