[anacron] notification à l'aide de systemd (résolu)

Applications, problèmes de configuration réseau
Répondre
Tristelune
Elfe
Messages : 516
Inscription : mer. 01 août 2007, 16:38

[anacron] notification à l'aide de systemd (résolu)

Message par Tristelune »

Salut à tous,

j'aimerais savoir lorsqu'une nouvelle version beta du logiciel geogebra (en version beta) sort. Pour cela j'ai écrit un script (geogebra.sh) qui me donne la dernière version et j'aimerais recevoir des notifications lorsqu'une nouvelle version est sortie (pas trouvé de flux rss, ni de mailing list). Je vais expliquer ma méthode, n'hésitez pas à me dire s'il y a plus simple.

J'ai vu que systemd inclus un système semblable à anacron et cron. J'aimerais recevoir chaque jour une notification et si la machine était éteinte au moment de l'envoi de la notification, j'aimerais qu'elle soit envoyée lors de la prochaine utilisation. Pour tester si tout fonctionne, je me contente maintenant d'une tâche semblable à cron, on passera à anacron après. J'utilise la commande suivante pour envoyer la notification:

Code : Tout sélectionner

$ notify-send "Nouvelle version de geogebra:\n $file"
$file contient le nom du nouvel installeur. Je donnerai le contenu des fichiers que j'ai créé après, je donne à présent juste un aperçu. En suivant le wiki, j'ai créé les fichiers: timer-hourly.target, timer-hourly.timer et geogebra.service. C'est le service geogebra-service qui doit m'envoyer la notification. Toutefois, lorsque le service est démarré, ça ne fonctionne pas. J'ai tout d'abord remarqué que systemd ne peux pas exécuter des scripts, il faut lui donner la commande du shell et en argument le script à exécuter. Ca ça doit être bon. A mon avis le problème est le suivant: le service se lance en tant que root. Et si en tant que root j'exécute

Code : Tout sélectionner

$ notify-send "Nouvelle version de geogebra:\n $file"
Rien ne se passe. Là j'avoue que ce n'est pas du tout clair pourquoi. J'ai toutefois trouvé que si je lance la commande notify-send avec mon utilisateur, tout fonctionne bien. J'en déduis que c'est ce qu'il faut faire. Mais maintenant comment ? Je vois deux solutions et je ne sais pas quoi privilégier, sans compter qu'au niveau sécurité je n'en sais rien. La première: dans le geogebra.service:

Code : Tout sélectionner

ExecStart=su user -c "/usr/bin/notify-send \"Nouvelle version de geogebra:...\""
Pour que notify-send soit lancé avec mon utilisateur. J'ai aussi remarqué qu'on peut spécifier un utilisateur dans le service. Toutefois si je l'utilise, j'obtiens l'erreur suivante:

Code : Tout sélectionner

Jul 01 15:00:17 bibine systemd[1]: Starting Geogebra notification...
Jul 01 15:00:17 bibine systemd[1]: Started Geogebra notification.
Jul 01 15:00:17 bibine systemd[1]: Starting Hourly Timer Target.
Jul 01 15:00:17 bibine systemd[1]: Reached target Hourly Timer Target.
Jul 01 15:00:17 bibine systemd[1]: Service timer-hourly.target is not needed anymore. Stopping.
Jul 01 15:00:17 bibine systemd[1]: Stopping Hourly Timer Target.
Jul 01 15:00:17 bibine systemd[1]: Stopped target Hourly Timer Target.
Jul 01 15:00:17 bibine systemd[17823]: Failed at step USER spawning /usr/bin/notify-send: No such process
Jul 01 15:00:17 bibine systemd[1]: geogebra.service: main process exited, code=exited, status=217/USER
A mon avis c'est parce que j'ai juste utilisé la ligne User dans:

Code : Tout sélectionner

[Service]
User=user                                         # Add a user if you wish the service to be executes as a particular user, else delete this line
#Type=                                          # Simple by default, change it if you know what you are doing, else delete this line
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
Je pense que dans ce cas je dois suivre le wiki ici. Mais avant de continuer j'aimerais savoir si je suis sur la bonne voie ou si j'ai tout faux. Quelle piste dois-je choisir ? Comme je fais ça pour la première fois, je n'ai aucun repère.

Merci!

Fichier timer-hourly.target:

Code : Tout sélectionner

[Unit]
Description=Hourly Timer Target
StopWhenUnneeded=yes
Fichier timer-hourly.timer:

Code : Tout sélectionner

[Unit]
Description=Hourly Timer

[Timer]
OnBootSec=5min
OnCalendar=hourly
Unit=timer-hourly.target

[Install]
WantedBy=basic.target
Fichier geogebra.service:

Code : Tout sélectionner

[Unit]
Description=Geogebra notification
Wants=timer-hourly.timer

[Service]
User=user                                         # Add a user if you wish the service to be executes as a particular user, else delete this line
#Type=                                          # Simple by default, change it if you know what you are doing, else delete this line
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
ExecStart=/usr/bin/sh -c "/home/user/geogebra.sh"
[Install]
WantedBy=timer-hourly.target
Dernière modification par Tristelune le mer. 16 juil. 2014, 17:15, modifié 1 fois.
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [anacron] notification à l'aide de systemd

Message par FoolEcho »

Salut,
Tristelune a écrit :Je vais expliquer ma méthode, n'hésitez pas à me dire s'il y a plus simple.
Le plus simple est de ne pas utiliser systemd, mais de créer directement une tâche cron dans l'espace de ton utilisateur (compte tenu que seul ton utilisateur a besoin d'être notifié).
«The following statement is not true. The previous statement is true.» :nage:
Tristelune
Elfe
Messages : 516
Inscription : mer. 01 août 2007, 16:38

Re: [anacron] notification à l'aide de systemd

Message par Tristelune »

FoolEcho a écrit : Le plus simple est de ne pas utiliser systemd, mais de créer directement une tâche cron dans l'espace de ton utilisateur (compte tenu que seul ton utilisateur a besoin d'être notifié).
Je vais donc prendre cette direction-là. Mais juste par curiosité: y'a-t-il un avantage à utiliser le système cron/anacron de systemd ? Ou rien ne vaut les programmes originaux ?
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [anacron] notification à l'aide de systemd

Message par FoolEcho »

Ben... Pour reprendre le wiki anglophone (et pour voir ce que tu as fait ^^), le système de planification des tâches de systemd est plutôt lourd à mettre en place.

Il se justifierait plutôt (toujours dans le wiki), pour mettre en place une tâche qui nécessiterait de récupérer des logs ou qui dépendrait d'autres services. Là oui. Pour un simple besoin d'être notifié comme dans ton cas, ça ne se justifie pas trop, je trouve. D'autant plus que c'est une tâche propre à ton utilisateur (et le script est au niveau utilisateur) et qui n'est fonctionnel qu'en cas d'environnement graphique lancé (notify-send). Pour mettre ça en place au niveau systemd, ça implique tout de même de passer par l'admin apparemment (fabriquer un service pour qu'un utilisateur donné ou un groupe puisse le lancer).

Je suis adepte des solutions éprouvées, simples (et souvent élégantes) quand il est inutile de sortir l'artillerie lourde (mais bon, si on sait manier cette dernière, pourquoi pas ?). ;)

(de plus, ça passe par systemd quand même puisque le service cronie est lancé ;) )

J'avoue aussi ne pas pouvoir trop t'aider sur ce sujet (toujours pas trop eu le temps de regarder ces questions de systemd/cron et systemd/utilisateur... même si je vois bien l'intérêt... pour des tâches plus importantes ; ceci étant pour des services niveau utilisateur, il me semble avoir lu que ce n'était pas encore la panacée justement...).
Maintenant si tu veux le faire à la systemd, le hic provient probablement de ta ligne User= effectivement.
«The following statement is not true. The previous statement is true.» :nage:
Tristelune
Elfe
Messages : 516
Inscription : mer. 01 août 2007, 16:38

Re: [anacron] notification à l'aide de systemd

Message par Tristelune »

FoolEcho a écrit : Je suis adepte des solutions éprouvées, simples (et souvent élégantes) quand il est inutile de sortir l'artillerie lourde (mais bon, si on sait manier cette dernière, pourquoi pas ?). ;)
C'est vrai qu'avec l'utilisation de systemd, c'est un peu le cas. J'ai l'impression de mettre un mastodonte en place pour une petite fenêtre. Tu m'a permis d'éliminer une variante: soit y aller directement avec cron/anacron, soit systemd et laisser tomber la possibilité:

Code : Tout sélectionner

ExecStart=su user -c "/usr/bin/notify-send \"Nouvelle version de geogebra:...\""
FoolEcho a écrit : Maintenant si tu veux le faire à la systemd, le hic provient probablement de ta ligne User= effectivement.
Je me suis dis que je n'en étais peut-être pas si loin et donc que j'allais encore un peu insister. J'ai conscience que c'est sortir l'artillerie lourde, mais ça m'oblige à plonger dans systemd et plein de choses qui sont de la magie noire, mais ça va me permettre de comprendre un peu mieux mon système. Pour l'instant ça fonctionne, mais je ne suis pas encore en anacron. Il faut exactement suivre le wiki et ça passe. Le truc est de définir un service utilisateur pour systemd. Il m'a fallu aussi définir une tâche cron pour l'utilisateur et pas au niveau du système. Dans le wiki on utilise parfois "user". Je ne savais pas si je devais le remplacer par mon utilisateur. Pour la suite, lorsque je mettrai user, c'est qu'il faudra le mettre tel quel, et <user> est à remplacer par le nom de l'utilisateur de la machine. J'ai donc crée le répertoire ~/.config/systemd/user et j'y ai placé les fichiers timer-hourly.target, timer-hourly.timer ainsi que geogebra.service. Le code des deux premiers n'a pas changé, le code de geogebra.service est:

Code : Tout sélectionner

[Unit]
Description=Geogebra notification
Wants=timer-hourly.timer

[Service]
#User=     
#Type= this line
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
ExecStart=/usr/bin/sh -c '/home/<user>/geogebra.sh'    # More than one ExecStart can be used if required

[Install]
WantedBy=timer-hourly.target
J'ai donc supprimé la ligne User. Il m'a fallu ensuite créé des fichiers pour dbus comme indiqué dans le wiki pour un service pour l'utilisateur. J'ai donc créé le fichier /etc/systemd/system/user@.service.d/environment.conf:

Code : Tout sélectionner

[Service]
Environment=DISPLAY=:0
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%I/bus
ainsi que /etc/systemd/user/dbus.socket:

Code : Tout sélectionner

[Unit]
Description=D-Bus Message Bus Socket
Before=sockets.target

[Socket]
ListenStream=/run/user/%U/bus

[Install]
WantedBy=default.target
et /etc/systemd/user/dbus.service:

Code : Tout sélectionner

[Unit]
Description=D-Bus Message Bus
Requires=dbus.socket

[Service]
ExecStart=/usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation
ExecReload=/usr/bin/dbus-send --print-reply --session --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig
J'ai ensuite activé dbus.socket avecc

Code : Tout sélectionner

# systemctl --global enable dbus.socket
J'ai fini par activer les services timer-hourly.timer et geogebra.service à l'aide de

Code : Tout sélectionner

systemctl --user enable timer-hourly.timer
idem pour geogebra. Je ne trouvais pas les services démarrés pour l'utilisateur, on peut les avoir à l'aide de

Code : Tout sélectionner

systemctl --user
Et la tâche cron fonctionne à présent. Je vais passer à la tâche anacron pour obtenir ce que je souhaite.
Moviuro
Elfe
Messages : 765
Inscription : dim. 17 juin 2012, 22:49

Re: [anacron] notification à l'aide de systemd

Message par Moviuro »

Tristelune a écrit :Et la tâche cron fonctionne à présent. Je vais passer à la tâche anacron pour obtenir ce que je souhaite.
Regarde https://wiki.archlinux.fr/index.php/Ref ... temd-timer pour une inspiration sur la méthode anacron de systemd (avec en bonus le test de connectivité).

Aussi, je pense que ça peut intéresser du monde ce genre de trucs (notifications dans une session utilisteur à l'aide de systemd) et ça serait super cool si tu pouvais mettre ça sur le wiki :chinois:
psycho : Latitude E6430 ; BTRFS over LUKS, UEFI & secureboot
schizo : Acer 8942G ; KDE 4, BTRFS over LUKS ; W7 (prend la poussière)
toxo : i5-6600K, bspwm, VM W10 en PCI-passthrough
deadman : Lenovo Thinkcenter, OpenBSD 6.0-stable
popho.be : Kimsufi KS-3, FreeBSD 11.0
Loi de Murphy : Le jour où tu as besoin d'une backup, tu te dis que tu aurais dû en mettre en place
Venez sur IRC en plus du forum !
Tristelune
Elfe
Messages : 516
Inscription : mer. 01 août 2007, 16:38

Re: [anacron] notification à l'aide de systemd

Message par Tristelune »

Moviuro a écrit : Regarde https://wiki.archlinux.fr/index.php/Ref ... temd-timer pour une inspiration sur la méthode anacron de systemd (avec en bonus le test de connectivité).
Ca correspond aux changements que j'avais prévus de faire. Je viens de les effectuer, maintenant place aux tests!
Moviuro a écrit : Aussi, je pense que ça peut intéresser du monde ce genre de trucs (notifications dans une session utilisteur à l'aide de systemd) et ça serait super cool si tu pouvais mettre ça sur le wiki :chinois:
Je peux mettre ce que j'ai fait avec systemd sur le wiki. Je vais attendre que tout fonctionne avant de le mettre. Toutefois je vois mal le système de notification sur le wiki. Pour moi le wiki traite avant tout d'un sujet, pas de la manière de combiner différents outils comme j'ai fait ici. Des avis pour ou contre ?
Tristelune
Elfe
Messages : 516
Inscription : mer. 01 août 2007, 16:38

Re: [anacron] notification à l'aide de systemd

Message par Tristelune »

Mes tests avancent et je pense que le tout fonctionne à présent. Je suis en train de mettre sur le wiki les pages que j'ai utilisées. C'est en cours de rédaction, pour l'instant il y a ça:

https://wiki.archlinux.fr/Systemd/cron

Est-ce que quelqu'un pourrait jeter un coup d'oeil une fois que j'aurai fini ? Je l'avertirai par MP quand ce sera bon.

Merci à tous pour le coup de main!

EDIT: et pendant que j'y pense: si certains sont intéressés par un tel système de notification, n'hésitez pas à m'envoyez un MP! :)
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [anacron] notification à l'aide de systemd (résolu)

Message par FoolEcho »

Tristelune a écrit :Est-ce que quelqu'un pourrait jeter un coup d'oeil une fois que j'aurai fini ? Je l'avertirai par MP quand ce sera bon.
Je surveille au fur et à mesure (pour l'instant ça me paraît clair et simple :chinois: ). ^^
«The following statement is not true. The previous statement is true.» :nage:
Tristelune
Elfe
Messages : 516
Inscription : mer. 01 août 2007, 16:38

Re: [anacron] notification à l'aide de systemd (résolu)

Message par Tristelune »

FoolEcho a écrit : Je surveille au fur et à mesure (pour l'instant ça me paraît clair et simple :chinois: ). ^^
C'est sympa, merci! :D
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [anacron] notification à l'aide de systemd (résolu)

Message par FoolEcho »

Ceci étant, je n'avais pas encore fait de relecture :mrgreen: mais je vois que d'autres s'en sont occupés. :)
«The following statement is not true. The previous statement is true.» :nage:
Répondre