Apt, Systemd, sans pk-update-icon point de salut

Salut
je me suis intéressé aux diverses outils disponibles dans un environnement systemd pour ce qui concerne la mise à jour automatique des paquets

Quand on regarde le contenu du paquet apt on y trouve:

  • Les services systemd
    /lib/systemd/system/apt-daily-upgrade.service
    /lib/systemd/system/apt-daily-upgrade.timer
    /lib/systemd/system/apt-daily.service
    /lib/systemd/system/apt-daily.timer

  • Une tache au calendrier
    /etc/cron.daily/apt-compat

Ne nous attardons pas sur la tâche au calendrier. Elle ne fait rien dans un environnement systemd
if [ -d /run/systemd/system ]; then
_ exit 0_
fi

Les services systemd:

  • apt-daily-upgrade.service
    Ne se lance qu’au premier boot, si le PC est en alimentation sur secteur et déclenche le script /usr/lib/apt/apt.systemd.daily install. L’option install est basée sur l’utilisation de unattended-upgrade et ne fera rien si unattended-upgrades n’est pas configuré.

  • apt-daily-upgrade.timer
    Est un simple compteur.
    La commande systemctl list-timers nous indique qu’il lance apt-daily-upgrade.service au bout de 24h. Aucun effet chez moi le PC ne reste pas allumé en permanence

Conclusion
3 dispositifs qui ne servent à rien sur un PC familial qui n’est pas allumé en permanence. Donc ça oblige d’utiliser le paquet pk-update-icon pour avoir une notification de mise à jour disponible et pouvoir lancer l’outil graphique de gnome pour faire les mises à jour.

NB j’ai détourné apt-daily-upgrade.service pour lui faire lancer /usr/lib/apt/apt.systemd.daily update et envoyer un mail. voir Envoyer les messages debug a root par mail mais c’est une autre histoire.

Pour ma part, j’utilise apticron.
Il m’informe des paquets en attente par mail.
ET / Sinon unattended-upgrades me fait les mises à jours de sécurité automatique.

https://packages.debian.org/fr/stretch/apticron

OK je vais essayer apticron pour le mail.

Et je désactive les services inutiles:

root@debian:/# systemctl disable apt-daily-upgrade.timer
root@debian:/# 

root@debian:# systemctl mask apt-daily-upgrade.service
Created symlink /etc/systemd/system/apt-daily-upgrade.service → /dev/null.

root@debian:/# systemctl mask apt-daily.service
Created symlink /etc/systemd/system/apt-daily.service → /dev/null.

sauf que

root@debian:/etc/cron.d# cat apticron
# cron entry for apticron

33 * * * * root if test -x /usr/sbin/apticron; then /usr/sbin/apticron --cron; else true; fi

ça veut dire qu’il est lancé à la 33ieme minute de chaque heure, je voudrais qu’il soit lancé au boot car j’ai paramétré pk-update-icon pour qu’il soit lancé 6 mn après l’ouverture de session :joy:

Alors je mets ça


# cron entry for apticron

@reboot root if test -x /usr/sbin/apticron; then /usr/sbin/apticron --cron; else true; fi

Si tu installe anacron, je pense que la tache sera lancé des le démarrage de la machine.

Tu duplique la tache pour qu’elle se lance à 1h00 ( par exemple)

Anacron est déja installé, pour info il lance ce qui est dans/etc/cron.daily
le parametre @reboot fonctionne très bien

root@debian:/# journalctl -b | grep cron
juin 23 11:07:37 debian cron[585]: (CRON) INFO (pidfile fd = 3)
juin 23 11:07:38 debian systemd[1]: anacron.timer: Adding 3min 38.859065s random time.
juin 23 11:07:38 debian systemd[1]: Started Trigger anacron every hour.
juin 23 11:07:38 debian systemd[1]: Started Run anacron jobs.
juin 23 11:07:38 debian systemd[1]: anacron.timer: Adding 4min 33.857410s random time.
juin 23 11:07:38 debian systemd[1]: anacron.timer: Adding 3min 13.418926s random time.
juin 23 11:07:38 debian cron[585]: (CRON) INFO (Running @reboot jobs)
juin 23 11:07:38 debian anacron[601]: Anacron 2.3 started on 2017-06-23
juin 23 11:07:39 debian systemd[1]: anacron.timer: Adding 4min 51.130576s random time.
juin 23 11:07:39 debian anacron[601]: Normal exit (0 jobs run)
juin 23 11:07:40 debian CRON[612]: pam_unix(cron:session): session opened for user root by (uid=0)
juin 23 11:07:41 debian CRON[665]: (root) CMD (if test -x /usr/sbin/apticron; then /usr/sbin/apticron --cron; else true; fi)
juin 23 11:07:43 debian CRON[612]: pam_unix(cron:session): session closed for user root

1 J'aime

je connaissais pas @reboot.

merci de l’info

ça marche mais ce n’est pas satisfaisant pour mon cas car il faut que le réseau soit accessible pour utliser les fonctions d’apt. Et je ne maitrise pas la séquentialité.
Mais ça m’a permis de savoir que par défaut les tâches de cron et anacron génèrent un mail de résultat. :grinning:

Donc retour dans le futur:

  • Suppresion de apticron

  • Masquage des services systemd apt qui ne me conviennent pas pour un PC familial qui est allumé et éteins plusieurs fois par jour

root@debian:/# systemctl mask apt-daily-upgrade.service
Created symlink /etc/systemd/system/apt-daily-upgrade.service → /dev/null.
root@debian:/# systemctl mask apt-daily.service
Created symlink /etc/systemd/system/apt-daily.service → /dev/null.
root@debian:/# systemctl disable apt-daily-upgrade.timer
Removed /etc/systemd/system/timers.target.wants/apt-daily-upgrade.timer.
root@debian:/# systemctl disable apt-daily.timer
Removed /etc/systemd/system/timers.target.wants/apt-daily.timer.

  • Création de mon script perso dans /etc/cron.daily basé sur apt-compat allégé pour lancement de /usr/lib/apt/apt.systemd.daily sans erreurs d’accès au réseau
root@debian:/etc/cron.daily# cat apt-perso 
#!/bin/sh
set -e
# pour tracer demasque set -x
#set -x
check_power()
{
    # laptop check, on_ac_power returns:
    #       0 (true)    System is on main power
    #       1 (false)   System is not on main power
    #       255 (false) Power status could not be determined
    # Desktop systems always return 255 it seems
    if which on_ac_power >/dev/null 2>&1; then
        on_ac_power
        POWER=$?
        if [ $POWER -eq 1 ]; then
            return 1
        fi
    fi
    return 0
}

# ensure we don't do this on battery
check_power || exit 0

# run daily job
exec /usr/lib/apt/apt.systemd.daily update
root@debian:/# 

  • Et voilà le mail de compte-rendu de mon script

  • Quelques infos sur anacron
    . Vérifier le lancement des tâches en commande root: run-parts -v /etc/cron.daily
    . Pour forcer le lancement au reboot, supprimer le fichier stamp dans /var/spool/anacron

root@debian:/# journalctl -b | grep anacron
juin 23 15:41:18 debian anacron[645]: Anacron 2.3 started on 2017-06-23
juin 23 15:41:19 debian anacron[645]: Will run job `cron.daily' in 5 min.
juin 23 15:41:19 debian anacron[645]: Jobs will be executed sequentially
juin 23 15:41:17 debian systemd[1]: anacron.timer: Adding 5.016635s random time.
juin 23 15:41:17 debian systemd[1]: Started Trigger anacron every hour.
juin 23 15:41:17 debian systemd[1]: Started Run anacron jobs.
juin 23 15:41:17 debian systemd[1]: anacron.timer: Adding 1min 40.754219s random time.
juin 23 15:41:17 debian systemd[1]: anacron.timer: Adding 41.137811s random time.
juin 23 15:41:47 debian systemd[1]: anacron.timer: Adding 2min 45.004738s random time.
juin 23 15:46:18 debian anacron[645]: Job `cron.daily' started
juin 23 15:46:18 debian anacron[1835]: Updated timestamp for job `cron.daily' to 2017-06-23
juin 23 15:47:48 debian anacron[645]: Job `cron.daily' terminated (mailing output)
juin 23 15:47:49 debian anacron[645]: Normal exit (1 job run)
juin 23 15:47:49 debian systemd[1]: anacron.timer: Adding 33.202913s random time.
juin 23 16:00:34 debian systemd[1]: Started Run anacron jobs.
juin 23 16:00:34 debian anacron[3411]: Anacron 2.3 started on 2017-06-23
juin 23 16:00:34 debian anacron[3411]: Normal exit (0 jobs run)
juin 23 16:00:34 debian systemd[1]: anacron.timer: Adding 1min 53.604500s random time. 

Simplification:

  • plutôt que de lancer un script “usine à gaz” lancer directement les commandes qui m’interessent

  • script perso

 root@debian:/# cat /etc/cron.daily/perso-apt 
#!/bin/sh
# pour tracer demasquer set -x
#set -x
#
# misee a jour des listes - vérification des paquets disponible pour mise à jour
apt update 
echo "resultat de la commande update ="$? 
apt list --upgradable
# 
#

  • sur le modèle apt-showversions
root@debian:/# cat /etc/cron.daily/apt-show-versions 
#!/bin/sh
#set -x
[ -f /usr/bin/apt-show-versions ] || exit 0

apt-show-versions -i -v
echo "resultat de apt-show-versions=" $?
apt-show-versions -u -v
root@debian:/# 

  • A propos d’anacron:

. Anacron est lancé à T boot + 5mn
. la tâche cron.daily dure moins de 4 mn
. le mail qui sera reçu à environ T boot + 9 mn donne les compte-rendus de toutes les tâches verbeuses

Finalement je ne laisse qu’un seul script qui me convient:

root@debian:/etc/cron.daily# cat apt-show-versions
#!/bin/sh
#set -x
[ -f /usr/bin/apt-show-versions ] || exit 0
echo "mise à jour des list par apt-show-versions"
apt-show-versions -i -v
#echo "resultat de apt-show-versions=" $?
echo "listage des paquets pouvant être mis à jour"
apt-show-versions -u -v
root@debian:/etc/cron.daily# 

:sunglasses:

Et la notification qui va bien dans gnome:

Pour lancer la mise à jour