Forum Linux.général Comment réveiller l'ordinateur du mode veille pour vérifier le courrier entrant ?

Posté par  . Licence CC By‑SA.
Étiquettes :
4
20
oct.
2023

Bonjour,

Mon ordinateur passe la plupart de son temps en mode veille (veille sur mémoire aka sleep) lorsqu'il est inutilisé. Je cherche à faire en sorte qu'il se réveille à une heure précise pour lancer mon courrielleur et vérifier et télécharger le nouveau courrier entrant, le cas échéant. J'utilise l’application Geary qui est paramétrée pour récupérer les courriels au lancement. Je précise également que ma session est ouverte pendant que l'ordinateur est en veille.

Là ou je bute c'est « comment réveiller l'ordinateur du mode veille pour lui faire exécuter Geary sur la session en cours ? ».

Après les recherches, il semblerait que systemd puisse faire le job avec l'option "WakeSystem=true".

J'ai donc fait quelques recherches dans la doc ainsi que dans différents forums et je crée donc un fichier wakeup.timer :

[Unit]
Description=Scheduled wake up at 6pm

[Timer]
Unit=wakeup.service
OnCalendar=*-*-* 18:00
WakeSystem=true
Persistent=false

[Install]
WantedBy=multi-user.target

et un fichier wakeup.service avec une commande bidon pour voir si le service fonctionne et réveille sort bien l'ordinateur du mode veille :

[Unit]
Description=Checking emails at scheduled time.
#RefuseManualStart=true
#RefuseManualStop=true
ConditionACPower=true          # ensure power cable plugged in
Wants=network-online.target    # wait for network to be available
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/echo "Wake up Neo" >> /dev/null

J'active le service :

systemctl enable wakeup.timer ; systemctl start wakeup.timer

Et je mets l'ordinateur en veille avant l'heure convenue.

Premier problème : rien ne se passe.

Pourtant je vérifie avec systemctl list-timers
Le service apparait bien et est bien exécuté mais l'ordinateur reste en veille.

Pouvez-vous me dire ce qui ne fonctionne pas ?

Et pour aller plus loin : comment faire en sorte de lancer Geary au réveil en tant qu'utilisateur ?
Dans le service systemd, il me semble que les programmes sont lancés en tant que root…

Merci d'avance !

  • # Exemple

    Posté par  . Évalué à 4.

    Un exemple de ce qui fonctionne chez moi :

    Timer :
    [Unit]
    Description=Backup du dossier musique

    [Timer]
    Unit=backup_musique.service
    OnCalendar=Mon,Tue,Wed,Thu,Sat,Sun --* 03:00
    WakeSystem=true
    Persistent=false

    [Install]
    WantedBy=multi-user.target

    Service :
    [Unit]
    Description=Backup du dossier musique
    RefuseManualStart=true
    RefuseManualStop=true
    Wants=network-online.target
    After=network-online.target

    [Service]
    Type=oneshot
    ExecStart=/bin/systemd-inhibit --what=handle-lid-switch --why=backups /etc/systemd/system/backup_musique.sh

    J'ai tout mis dans le dossier /etc/systemd/system$

    • [^] # Re: Exemple

      Posté par  . Évalué à 2.

      Merci, ça confirme que ma configuration est bonne.

  • # deux conditions

    Posté par  . Évalué à 6. Dernière modification le 20 octobre 2023 à 19:55.

    Dans le BIOS :

    • vérifier que wake-on-lan est enabled (sur mon BIOS, ça s'appelle pme-on-lan)
    • vérifier que ERP mode (ou ERP Ready) est disabled
    • [^] # Re: deux conditions

      Posté par  . Évalué à 3.

      Pour la première option, j'ai un doute : quel lien avec le réveil par le réseau ?

      Sinon, j'ai modifié le paramètre ErP comme tu me l'as indiqué : il était sur "Enabled (S4+S5)". Je l'ai passé à "Enabled (S5)" et cela a fonctionné, le PC s'est réveillé tout seul (à noter que cela fonctionne aussi en paramétrant sur "Disabled").

      • [^] # Re: deux conditions

        Posté par  . Évalué à 3.

        Pour la première option, j'ai un doute : quel lien avec le réveil par le réseau ?

        wake-on-lan signifie réveil par le réseau.

        • [^] # Re: deux conditions

          Posté par  . Évalué à 5.

          Oui, j'avais compris, la question était plutôt : quel est le lien entre le réveil par le réseau et la situation présente ? Puisque, si je ne m'abuse, on ne cherche pas à passer par le réseau pour réveiller l'ordinateur, d'où ma question : pourquoi activer cette option dans ce contexte ?

          Dans le doute, je l'ai laissée désactivée. Mais modifier le paramètre "ErP" que tu m'as indiqué était la bonne solution.

          • [^] # Re: deux conditions

            Posté par  . Évalué à 5. Dernière modification le 21 octobre 2023 à 10:09.

            Effectivement, aucun ! Je me suis précipité sur le wake sans réfléchir plus loin…

  • # À quoi bon ?

    Posté par  . Évalué à 2.

    Pourquoi ne pas simplement laisser tourner ton logiciel de courrier en arrière-plan pour qu'il récupère à intervalle régulier les nouveaux messages ?

    • [^] # Re: À quoi bon ?

      Posté par  . Évalué à 2.

      Parce que quand l'ordinateur est en veille, il ne le fait pas.

      L'idée est de réveiller l'ordinateur à un moment T. Si le courrielleur est déjà lancé, il récupérera tout seul les courriels dès que le réseau sera opérationnel. Sinon, je cherche à le lancer automatiquement à ce moment.

      (Accessoirement, j'en profite pour toucher à systemd que je n'ai jamais vraiment utilisé).

      • [^] # Re: À quoi bon ?

        Posté par  . Évalué à 5.

        Ok, je n'avais pas percuté que l'ordinateur est en veille. Mais je ne comprends toujours pas le problème (hors l'intérêt de se frotter à systemd) : si tu n'es pas devant l'ordinateur, à quoi cela sert-il de relever le courrier ? Ne suffirait-il pas de s'assurer qu'il le fera dès que tu réveilleras ta session pour utiliser l'ordi ? À quoi bon forcer le réveil de l'ordi à 9h pour relever le courrier si tu viens utiliser l'ordi à 9h37 et qu'à ce moment là il relève aussi le courrier ?

        • [^] # Re: À quoi bon ?

          Posté par  . Évalué à 7. Dernière modification le 20 octobre 2023 à 22:41.

          Bah l'idée c'est que GNOME affiche une notification si Geary a reçu quelque chose et que je le vois quand je passe devant l'écran, sans pour autant être posé devant. Un peu comme une notification de téléphone.

          Alternativement, on peut laisser l'ordinateur tourner en continu, il affichera alors à l'écran les notifications au fil de la réception des nouveaux messages, mais ça ne me parait pas tout-à-fait optimal (c'est de l'énergie gaspillée). Tout ce que je veux c'est juste qu'il effectue tout seul une dernière petite vérification en fin de journée et voir de loin s'il y a besoin d'y plus attentivement ou pas. Et s'il n'y a rien, il se rendort tout seul. C'est pour ça que l'idée de réveiller la machine à une heure précise et de lancer l'application à ce moment m'a paru intéressante (en plus de faire un petit challenge technique :).

          • [^] # Re: À quoi bon ?

            Posté par  . Évalué à 2.

            Ok, je comprends mieux.

          • [^] # Re: À quoi bon ?

            Posté par  . Évalué à 1.

            J'ai pendant longtemps utilisé un script Python maison sur mon serveur autohébergé qui vérifiait sur différents comptes les UNREAD de IMAP et poussait le résultat sous une forme de compteur sur une page web statique que je consultais via mobile ou fixe au gré de mes disponibilités.
            Mais bon j'ai arrêté parce que les mots de passe en clair, humhum.
            Ça doit sûrement être faisable avec des API et une gestion via trousseau ou tokens en fonction des fournisseurs.

  • # J'y suis presque

    Posté par  . Évalué à 2.

    J'avance petit à petit :

    • le réveil automatique fonctionne grâce à un timer systemd. Cependant la commande exécutée est une commande lancée par root, or je voudrais que la commande soit lancée par l'utilisateur, dans sa session.
    • J'ai configuré un service dans ma session (qui doit lancer le courrielleur), enregistré dans ~/.config/systemd/user/wakeup.service et ayant le contenu suivant :
    [Unit]
    Description=Check emails at scheduled time.
    Wants=network-online.target    # wait for network to be available
    After=network-online.target
    PartOf=graphical-session.target
    After=graphical-session.target
    
    [Service]
    Type=exec
    Restart=no
    ExecStart=/usr/bin/flatpak run org.gnome.Geary
    
    [Install]
    WantedBy=graphical-session.target
    

    Après quoi, j'active le service :

    $ systemctl --user enable wakeup.service
    

    et je le lance pour voir :

    $ systemctl --user start wakeup.service
    

    Là, la fenêtre de Geary s'ouvre bien comme escompté.

    Maintenant la question, c'est comment lier le wakeup.timer (qui réveille bien l'ordinateur) au wakeup.service dans mon dossier personnel (qui lance bien l'application souhaitée) ?

    Auriez-vous des explications ou pistes à me donner ?

    • [^] # Re: J'y suis presque

      Posté par  . Évalué à 2.

      Et t'as essayé de mettre aussi le wakeup.timer dans ~/.config/systemd/user/ ?

      (en l'activant comme précédemment, en n'oubliant pas le --user )

      chez moi ça suffit (il faut juste que le timer et le service aient le même nom)

      • [^] # Re: J'y suis presque

        Posté par  . Évalué à 2. Dernière modification le 21 octobre 2023 à 08:44.

        J'ai essayé avec le contenu suivant pour le fichier .timer :

        [Unit]
        Description=Scheduled wake up at 6pm
        
        [Timer]
        Unit=wakeup.service
        OnCalendar=Mon,Tue,Wed,Thu,Fri,Sat *-*-* 08:25
        WakeSystem=true
        Persistent=false
        
        [Install]
        WantedBy=default.target
        

        (J'ai changé l'heure à des fins de test).

        Je lance le tout :

        $ systemctl enable --user wakeup.timer; systemctl start --user wakeup.timer
        

        Mais j'obtiens un message d'erreur difficilement compréhensible :

        Job failed. See "journalctl -xe" for details.
        

        Et voilà ce que me donne journalctl -xe :

        oct. 21 08:28:25 ordinateur systemd[2342]: Reloading requested from client PID 27513 (unit vte-spawn-803f6e00-a8ec-4b01-9f7f-1dfb9e88394a.scope)...
        oct. 21 08:28:25 ordinateur systemd[2342]: Reloading...
        oct. 21 08:28:25 ordinateur systemd[2342]: Reloading finished in 160 ms.
        oct. 21 08:28:25 ordinateur systemd[2342]: wakeup.timer: Failed to enter waiting state: Operation not permitted
        oct. 21 08:28:25 ordinateur systemd[2342]: wakeup.timer: Failed with result 'resources'.
        ░░ Subject: Unit failed
        ░░ Defined-By: systemd
        ░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
        ░░ 
        ░░ The unit UNIT has entered the 'failed' state with result 'resources'.
        oct. 21 08:28:25 ordinateur systemd[2342]: Failed to start wakeup.timer
        ░░ Subject: L'unité (unit) UNIT a échoué
        ░░ Defined-By: systemd
        ░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
        ░░ 
        ░░ L'unité (unit) UNIT a échoué, avec le résultat failed.
        

        et voilà ce que me donne systemctl status --user wakeup.timer :

        
        × wakeup.timer
        Loaded: loaded (/home/Eridor/.config/systemd/user/wakeup.timer; enabled; preset: disabled)
        Active: failed (Result: resources)
        Trigger: n/a
        Triggers: ● wakeup.service
        
        oct. 20 22:11:01 ordinateur systemd[2342]: Failed to start wakeup.timer
        oct. 21 08:22:30 ordinateur systemd[2342]: wakeup.timer: Failed to enter waiting state: Operation not permitted
        oct. 21 08:22:30 ordinateur systemd[2342]: wakeup.timer: Failed with result 'resources'.
        oct. 21 08:22:30 ordinateur systemd[2342]: Failed to start wakeup.timer
        oct. 21 08:24:46 ordinateur systemd[2342]: wakeup.timer: Failed to enter waiting state: Operation not permitted
        oct. 21 08:24:46 ordinateur systemd[2342]: wakeup.timer: Failed with result 'resources'.
        oct. 21 08:24:46 ordinateur systemd[2342]: Failed to start wakeup.timer
        oct. 21 08:28:25 ordinateur systemd[2342]: wakeup.timer: Failed to enter waiting state: Operation not permitted
        oct. 21 08:28:25 ordinateur systemd[2342]: wakeup.timer: Failed with result 'resources'.
        oct. 21 08:28:25 ordinateur systemd[2342]: Failed to start wakeup.timer
        

        Il doit probablement y avoir des options mal configurées quelque part…

        Peux-tu me poster le contenu de ton fichier .timer pour comparer ?

        • [^] # Re: J'y suis presque

          Posté par  . Évalué à 2. Dernière modification le 21 octobre 2023 à 10:07.

          Je me réponds à moi-même :
          D'après la documentation de systemd, l'option "WakeSystem=true" requiert des privilèges que le simple utilisateur n'a pas.

          WakeSystem=

          Takes a boolean argument. If true, an elapsing timer will cause the system to resume from suspend, should it be suspended and if the system supports this. Note that this option will only make sure the system resumes on the appropriate times, it will not take care of suspending it again after any work that is to be done is finished. Defaults to false.
          Note that this functionality requires privileges and is thus generally only available in the system service manager.

          Note that behaviour of monotonic clock timers (as configured with OnActiveSec=, OnBootSec=, OnStartupSec=, OnUnitActiveSec=, OnUnitInactiveSec=, see above) is altered depending on this option. If false, a monotonic clock is used that is paused during system suspend (CLOCK_MONOTONIC), if true a different monotonic clock is used that continues advancing during system suspend (CLOCK_BOOTTIME), see clock_getres(2) for details.

          Du coup le problème reste entier et je sèche un peu…

          • [^] # Re: J'y suis presque

            Posté par  . Évalué à 2.

            Désolé pour la fausse piste :(

            au moins maintenant, il est certain que le service systemd ne peut être directement en mode utilisateur.

            J'ai recherché sur google comment lancer un service en tant qu'un certain utilisateur, et j'ai trouvé ça.

            dans ton service global, il faudrait semble-t-il rajouter les options :

            [Service]
            User=...
            Group=...
            
      • [^] # Re: J'y suis presque

        Posté par  (Mastodon) . Évalué à 5.

        Au passage, si on veut que l'utilisateur puisse laisser des trucs en arrière plan sans être connecté il faut lui donner les droits explicitement via loginctl enable-linger <user>

        En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # Approche gadget électronique

    Posté par  (Mastodon) . Évalué à 5.

    Ça me donne l'idée d'un gadget ça tiens. Un truc USB reconnu comme un clavier qui envoie la touche "réveil" (ou d'ailleurs n'importe quelle touche). Tu le programmes périodiquement et/ou le contrôle à distance…

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: Approche gadget électronique

      Posté par  . Évalué à 2.

      Ça serait peut-être plus simple que de batailler avec systemd… Je n'ai pas ça sous la main, mais je pense qu'un pointeur de présentation serait un bon candidat pour cette tâche. :D

  • # rtcwake

    Posté par  . Évalué à 2. Dernière modification le 26 octobre 2023 à 07:20.

    n'aiderait pas?

    sudo rtcwake -m no -l -t $(date +%s -d 'today 12:08')
    /sbin/kexec -l /boot/vmlinuz-$(uname -r) \
    --initrd=/boot/initrd.img-$(uname -r) --reuse-cmdline
    /sbin/kexec -e

  • # Commentaire supprimé

    Posté par  . Évalué à 1. Dernière modification le 26 octobre 2023 à 07:20.

    Ce commentaire a été supprimé par l’équipe de modération.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.