Lancer un script au démarrage sous Linux et BSD : quelle méthode pour quelle distribution ?

Lancer un script au démarrage sous Linux et BSD : quelle méthode pour quelle distribution ?

Rangez vos haches de guerre

Avatar de l'auteur
David Legrand

Publié dans

Logiciel

02/11/2021 13 minutes
49

Lancer un script au démarrage sous Linux et BSD : quelle méthode pour quelle distribution ?

Que l'on gère des serveurs sous Linux ou une machine plus classique, une question revient régulièrement : comment lancer un script au démarrage ? Mais du fait de la diversité des distributions, il n'y a pas de réponse simple à cette question. On distingue néanmoins quelques solutions communes. Tour d'horizon.

Créé il y a plus de 30 ans, le noyau Linux a donné naissance à un écosystème large et diversifié, allant de distributions ultra-légères pour systèmes embarqués à celles visant des serveurs, PC de bureau ou pour joueurs. Il y en a pour tous les goûts. Si toutes utilisent des briques communes, elles se distinguent par certains choix.

La diversité est une chance (quand on respecte l'autre)

L'un d'entre eux concerne le système d'initialisation (init) qui est le plus souvent un enchevêtrement d'outils legacy, utilisés de manière historique, et de décisions plus récentes. Avec un zeste de couche de compatibilité pour s'assurer que l'ensemble continue de fonctionner, sans perdre les administrateurs système et autres utilisateurs, qui ont leurs habitudes. Dès lors, il existe parfois différentes manières de lancer un script au démarrage.

Mais il n'est pas simple de savoir laquelle utiliser, dans quel but et avec quelles contraintes. Surtout que si l'on navigue entre différentes distributions, chacune aura ses propres règles. Sans parler de ceux qui livrent des conseils assez péremptoires en la matière. Car le sujet de « l'init » est devenu pour certains une quasi-guerre de religion, avec ses préceptes et ses adeptes. Au point de mener à Devuan, fork de Debian sans systemd.

C'est donc éloigné de ces considérations que nous avons cherché à comprendre comment lancer un script au lancement de différentes distributions. Car la diversité du monde Linux ne doit pas être une source de conflit, mais bien de complémentarité dans les approches, permettant de répondre à différents besoins.

Au commencement était System V

Tout comme Linux, init est issu du monde UNIX. C'est le premier programme lancé, prenant en charge toute la phase d'initialisation et ce qui en découle. Son fonctionnement, issu du Unix System V d'AT&T et ses niveaux d'exécution, est d'ailleurs l'un des points de divergence historique avec BSD (Berkley Standard Distribution).

L'approche « SysV » a longtemps été majoritaire au sein des différentes distributions Linux. Mais au fil des années, plusieurs initiatives ont été lancées pour le remplacer et/ou l'améliorer comme nous le verrons un peu plus loin. On trouve néanmoins toujours des traces de sa manière de fonctionner, plutôt basique.

Historiquement, la première chose que fait init (/sbin/init) est de lire le fichier /etc/inittab qui contient une série de scripts (run commands ou rc) à lancer selon le niveau d'exécution demandé puis passe à la phase de connexion ou du gestionnaire de fenêtres. Cette série de scripts est placée dans le dossier /etc/init.d avec des liens symboliques selon le niveau d'exécution du type /etc/rc0.d, /etc/rc1.d, /etc/rc2.d, etc. 

Pour connaître le niveau d'exécution (run level) de votre système vous pouvez utiliser l'un de ces commandes :

who -r
runlevel

rc.local : la vieille habitude

Dans la liste de scripts exécutés, il y en a un plutôt spécial : rc.local. Chargé après tous les autres il a été pensé pour permettre aux administrateurs système d'exécuter des actions une fois que le reste du système est prêt. On en trouve trace tant dans des documentations de distributions Linux que de BSD.

Son emplacement n'était d'ailleurs pas toujours le même, mais à travers le temps un (presque) consensus a émergé, consistant à le placer à la racine du dossier /etc. Il doit par contre toujours respecter quelques règles simples : être exécutable, commencer et finir comme un script.

Ainsi, il suffit le plus souvent de l'éditer ou de le créer (via nano, mais vous pouvez utiliser l'éditeur de votre choix) : 

sudo nano /etc/rc.local

Puis de l'enregistrer (CTRL+X). Dans notre exemple du jour, il ressemble à ça :

#!/bin/bash -e

date >> /var/log/boot_history.log

exit 0

Il nous permet de créer un fichier de log dans lequel nous enregistrons la date et l'heure de chaque démarrage de la machine. Notez que nous n'avons pas à utiliser sudo puisque ce script sera exécuté depuis l'utilisateur root. On peut d'ailleurs restreindre son accès au maximum et ne l'autoriser qu'à celui-ci :

chown root:root /etc/rc.local
chmod 700 /etc/rc.local

Droits utilisateurs avec chmod : quelques rappels

La première des deux commandes ci-dessus permet d'indiquer que le fichier appartient à l'utilisateur root et aux utilisateurs du groupe root. La seconde commande permet de définir les droits d'accès via trois chiffres : ceux de l'utilisateur propriétaire, du groupe, puis de tous les autres utilisateurs.

Ils sont le résultat de l'addition de trois chiffres : 

  • 4 : droits en lecture (r)
  • 2 : droits en écriture (w)
  • 1 : droits d'exécution (x)

Ainsi, l'attribut 700 donne tous les droits au propriétaire, aucun aux autres utilisateurs. On pourrait par exemple donner l'accès en lecture au groupe et aux autres utilisateurs (744) ou leur permettre également de l'exécuter (755).

Parfois le besoin de rester basique, simple

Si tout s'est bien passé, redémarrez le système (sudo reboot) vous devriez voir apparaitre le fichier de log qui sera désormais rempli avec une nouvelle ligne à chaque (re)démarrage :

cat /var/log/boot_history.log

Selon nos constatations cette méthode fonctionne avec la plupart des systèmes, même certains qui se sont éloignés de l'init de System V (nous verrons pourquoi ensuite), même lorsqu'ils ont fait le choix de systemd. Cette méthode est donc à privilégier quand vous avez simplement besoin d'effectuer une action, sans qu'elle n'ait à être maintenue dans le temps via un service avec un cycle complet (arrêt, redémarrage, analyse du statut, etc.)

Votre chemin, vous devez décider

Pour nombre de distributions, le mode de fonctionnement de l'init issu de System V n'était plus adapté. Elles ont donc cherché une solution plus « moderne », avec des avantages en termes de performance, de stabilité, de sécurité ou de gestion des dépendances. Comme souvent, Ubuntu s'est essayé à une solution maison avant de l'abandonner : Upstart. Elle est passée à System Deamon (systemd), désormais majoritaire.

Fedora et openSUSE avaient sauté le pas vers 2011, favorisant cette solution développée au départ par Lennart Poettering, alors développeur chez Red Hat. D'autres ont progressivement fait le même choix : Arch et ses principaux dérivés, puis Debian et Ubuntu. Tous le présentent comme une brique logicielle adaptée aux besoins des administrateurs, tout en conservant une compatibilité avec l'existant.

Pour ses détracteurs, systemd a surtout complexifié les choses en cherchant à éviter l'utilisation de scripts de lancement en devenant un élément central visant à simplifier les choses. Mais au point que de nombreux éléments dépendent de lui, dépassant le cadre qui devrait être celui d'un outil d'initialisation du système.

Certaines distributions se sont ainsi tournées vers l'OpenRC de Gentoo ou runit. Elles laissent même parfois le choix. C'est le cas du très modulaire Gentoo qui gère différents outils d'initialisation (dont SysVinit et systemd), mais aussi de Devuan qui est né de la volonté d'un Debian sans Systemd et défend « l'init freedom ». On peut ainsi y utiliser OpenRC, runit dans le choix proposé à l'installation, mais aussi sinit, s6 ou Sheperd issu de GNU/Hurd.

En 2015, Linux-FR avait fait un travail de synthèse des arguments pour ou contre systemd. Gentoo propose une comparaison des fonctionnalités de différents outils d'init dans sa documentation.

rc-local.service : opération compatibilité

Face à ce rejet d'une partie de la communauté et du bouleversement des habitudes, des solutions de compatibilité ont été mises en place, dont rc-local.service. Un service (ou démon) qui surveille si un script exécutable rc.local est présent au démarrage de la machine. Si c'est le cas, il est lancé. Sinon, le service est inactif.

Comme c'est trop souvent le cas, les différentes distributions ne se sont pas entendues sur l'emplacement du fichier à surveiller. C'est donc parfois /etc/rc.local. Parfois /etc/rc.d/rc.local. Pour savoir ce qu'il en est pour votre distribution, il suffit de demander le statut du service, dont la description précise cette information. 

Ainsi, sous Debian vous obtenez : 

$ systemctl status rc-local.service
● rc-local.service - /etc/rc.local Compatibility

Et sous Fedora :

$ systemctl status rc-local.service
○ rc-local.service - /etc/rc.d/rc.local Compatibility

Dans les deux cas, la méthode est la même que pour les distributions avec SysVinit : éditez le contenu du script, rendez-le exécutable. Vous n'avez rien d'autre à faire, à chaque démarrage il sera lancé automatiquement.

Créez un service pour systemd

Plutôt que des scripts, systemd introduit la notion d'unités, dont les services sont un type en particulier. Dans le cadre de cet article, nous ne nous intéresserons qu'à eux. Ils prennent la forme d'un fichier décrivant leur but et leur fonctionnement, ils sont stockés dans le dossier /etc/systemd/system/ et n'ont pas besoin d'être exécutables.

Pour lister tous les services du système (« q » pour quitter) :

systemctl list-units --type service --all

Pour disposer d'un équivalent à notre script rc.local ci-dessus, on peut ainsi créer un service simple :

sudo nano /etc/systemd/system/boot-logger.service

Notez que dans un billet de blog, Red Hat recommande de le placer dans /usr/local/lib/systemd/system et de créer un lien symbolique depuis /etc/systemd/system. Faites selon votre convenance

On y ajoute le contenu suivant puis on enregistre (CTRL+X) :

[Unit]
Description=Boot date & time logger

[Service]
Type=simple

ExecStart=/usr/bin/date
StandardOutput=append:/var/log/boot-date.log

[Install]
WantedBy=multi-user.target

Un service est toujours composé de ces trois sections. Ici, on décrit simplement ce à quoi il sert, l'exécutable à lancer, le fichier de log où ajouter le résultat. Notez que l'on utilise systématiquement des chemins complets pour les fichiers et exécutables. On peut bien entendu complexifier un service en décrivant des actions à exécuter lorsqu'il est arrêté, redémarré, un dossier d'exécution et un utilisateur à utiliser pour le lancer, etc.

La documentation de Red Hat Enterprise Linux (en français pour la version 7) est assez complète en la matière.  

Dépendances et conditions d'activation 

L'un des avantages de systemd étant sa gestion des dépendances, on pourrait par exemple attendre que le réseau soit actif pour lancer l'action. Pour cela, on ajoute une cible au paramètre After de la section Unit :

After=network.target

Pour lister toutes les cibles disponibles sur le système :

systemctl list-units --type target --all

On peut aussi vérifier qu'un fichier existe et est exécutable, si on compte l'utiliser dans le cadre du service :

ConditionFileIsExecutable=/usr/bin/local/script.sh

Une fois le fichier du service créé, on modifie les droits d'accès : 

sudo chmod 644 /etc/systemd/system/boot-logger.service 

On peut ensuite activer le service ou demander à connaitre son statut :

sudo systemctl enable boot-logger
sudo systemctl status boot-logger

Une fois activé il sera démarré à chaque lancement du système, l'action sera exécutée puis il sera mis en pause.

Crontab et @reboot : l'alternative simple

Si vous ne voulez pas dépendre de la méthode d'initialisation du système, vous pouvez opter pour cron. Pour rappel cet outil permet d'exécuter des tâches de manière récurrente, mais aussi à chaque démarrage. Pour cela, il faut lancer l'édition de son fichier de configuration (crontab), gérée par utilisateur :

crontab -e

Cela vous permet d'éditer celle de l'utilisateur actuel, mais si vous avez besoin d'exécuter des tâches avec les droits administrateur (root) comme c'est notre cas pour écrire dans /var/log/, vous pouvez utiliser sudo :

sudo crontab -e

Vous pourrez alors y ajouter la ligne suivante :

@reboot date >> /var/log/boot_history.log

Seul problème de cette solution : selon la distribution, elle s'exécutera plus ou moins tôt dans le démarrage, ce qui peut poser problème si vous avez besoin de certains éléments comme le réseau par exemple. Mais elle a l'avantage de fonctionner avec Arch et ses dérivées qui n'ont pas de service de compatibilité avec rc.local.

init alternatifs, FreeBSD : quelle solution choisir ?

Selon nos différents essais avec des distributions ne se reposant pas sur systemd et FreeBSD, il est toujours possible d'utiliser le fichier /etc/rc.local ou @reboot dans crontab pour lancer un script ou une commande au démarrage. Ce sont donc des solutions à privilégier pour des besoins simples.

Il est aussi possible de créer des services sous la forme de scripts RC, comme indiqué dans la documentation de FreeBSD. Gentoo détaille le fonctionnement d'OpenRC, Alpine donne l'exemple d'une création de service simple. Pour runit vous pouvez vous tourner vers la documentation de Void Linux qui l'utilise par défaut.

Lancer une application à la connexion de l'utilisateur

Il existe une dernière possibilité : lancer un script ou une application lorsque l'utilisateur se connecte via l'interface graphique ou un accès SSH par exemple. Dans le premier cas, cela dépendra de l'environnement. Cinnamon, GNOME, KDE, LXDE, MATE, XFCE et tous les autres proposent une telle fonctionnalité dans leurs paramètres.

Pour les scripts, cela dépend du shell. Bash permet par exemple d'éditer le fichier .bashrc pour y ajouter toutes les commandes de votre choix, et donc le lancement de script. C'est ici que l'on place par exemple les alias à créer comme nous l'avions déjà évoqué dans un précédent article. Par exemple :

alias fup="sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove"

Cette commande permet de lancer la mise à jour du système dans les distributions Linux exploitant APT via la commande fup. Le script .bash_logout sera pour sa part exécuté à la déconnexion. Pour ZSH, il y a un équivalent à la connexion avec le fichier .zshrc, etc. Vous pouvez aussi ne pas dépendre du shell utilisé avec le dossier /etc/profile.d/. Tout script exécutable qui y est placé est lancé à chaque chargement d'un shell, quel qu'il soit. Veillez par contre à ne pas préciser le shell à utiliser en tête de fichier (#/bin/bash par exemple).

Écrit par David Legrand

Tiens, en parlant de ça :

Sommaire de l'article

Introduction

La diversité est une chance (quand on respecte l'autre)

Au commencement était System V

rc.local : la vieille habitude

Droits utilisateurs avec chmod : quelques rappels

Parfois le besoin de rester basique, simple

Votre chemin, vous devez décider

rc-local.service : opération compatibilité

Créez un service pour systemd

Dépendances et conditions d'activation 

Crontab et @reboot : l'alternative simple

init alternatifs, FreeBSD : quelle solution choisir ?

Lancer une application à la connexion de l'utilisateur

Fermer

Commentaires (49)


Je préviens par avance :




  • Tout ce qui s’approche d’un troll pro/anti systemd ou autre sera modéré

  • Toute récidive mènera au blocage



Ce sera sans aucune sommation. Merci et bons échanges amicaux :chinois:


ah ouais c’est à ce point clivant comme sujet ?


Gromsempai

ah ouais c’est à ce point clivant comme sujet ?


Clairement :D


Gromsempai

ah ouais c’est à ce point clivant comme sujet ?


J’ai lu beaucoup d’échanges à ce sujet. C’est plutôt intéressant comme débat. On apprend des trucs techniques, etc. Mais c’est un sujet qui a une lourde charge passionnelle. Y a des questions de principes parfois. C’est aussi vif que des échanges politiques musclés mis en scène par certaines émissions télévisuelles.



Donc oui, les noms d’oiseaux ne sont pas loin.



Et pour un article qui cherche simplement à apprendre quelque chose à ses lecteurs et lectrices selon les différentes possibilités des clones et descendants d’Unix, c’est vrai que de se retrouver noyé sous un flot - que dis-je !? un torrent ! - d’échange de technicien.ne.s, qui s’y connaissent suffisamment pour ne pas avoir vraiment besoin de l’article juste pour se tirer la bourre et savoir qui c’est le meilleur, n’est pas souhaitable (ni peut-être même gérable si il y a un travail de modération rigoureux).


Gromsempai

ah ouais c’est à ce point clivant comme sujet ?


Le truc, c’est que systemd, ça va contre la philosophie même de Linux. Du coup, oui ça déchaîne les passions, entre ceux qui pensent que le but justifie les moyens, et ceux qui pensent que la philosophie de Linux est inaliénable.



Pourquoi systemd va à l’encontre de la philosophie de Linux ? C’est parce que Linux est construit sur le principe du KISS : keep it silly simple. Chaque application doit faire un seul job, et le faire bien. La grande majorité des commandes sur Linux prennent en entrée du texte, font leurs traitements, et ont en sortie du texte. C’est ce qui permet de “piper” ( ‘|’ ) les commandes entre elles, et de faire des trucs super puissants, en partant de choses simples. C’est la force de Linux, et c’est comme ça qu’il s’est construit pendant 20 ans.

Arrive systemd, qui est un monolithe, et qui fait des tonnes de choses en même temps. Il les fait bien, hein, mais il n’empêche que c’est une grosse bête, compliquée à mettre en place, à configurer etc.

Et là, c’est le drame : ça va à l’encontre de tous les instincts des puristes linuxiens. Et c’est plus profond que juste un changement logiciel, puisqu’il s’agit d’un changement de philosophie, d’identité même. Du coup, dans le microcosme linuxien, les débats ont été très violent. Et le sont toujours un peu.



Bref, tout ça pour dire que c’est un sujet sensible dans la communauté, et que le problème sous-jacent, philosophique, n’est toujours pas vraiment résolu.


On peut troller sur nano ?



je plaisante, super papier. Où je redécouvre le @reboot de cron, qui réserve bien des surprises dans ma mémoire, je ne m’y fit plus.


Oui c’est parfois aléatoire (d’une distribution à l’autre je veux dire), pour ça que je préviens. Mais bon, ça dépanne pour du besoin simple :D Pour nano, j’ai pris les devants dans l’article :D (mais il a l’avantage de m’éviter d’avoir à expliquer comment vi fonctionne :transpi:)


Le lino c’est mieux https://github.com/ahmednooor/lino



Il y a de quoi en faire tout un article des éditeurs de texte pour terminal.



Et merci pour l’article.


ben51

Le lino c’est mieux https://github.com/ahmednooor/lino



Il y a de quoi en faire tout un article des éditeurs de texte pour terminal.



Et merci pour l’article.


Sympathique, merci pour la suggestion ! Je vais l’essayer pendant quelques jours, vu que j’utilise principalement Windows je le trouve plus naturel que Nano.


Qu’est-ce que ça a d’aléatoire, le @reboot de cron ? Je l’utilise régulièrement, ça marche, je n’ai jamais rencontré le moindre problème avec.


Merci pour l’article, ça va me servir de très bonne base pour remettre à plat mes scripts de démarrage. :incline:



ben51 a dit:


Il y a de quoi en faire tout un article des éditeurs de texte pour terminal.




Nooooooooooooooooooon :transpi:




Et merci pour l’article.




Pas de quoi :chinois:


Oh siiiiiii ce serait un super dossier les éditeurs de texte pour terminal



David_L a dit:




  • Tout ce qui s’approche d’un troll pro/anti systemd ou autre sera modéré

  • Toute récidive mènera au blocage




D’un autre côté, l’article met le doigt sur ce qui fâche. Quand on se retrouve à gérer plusieurs distro différentes car achetées avec des produits différents, Linux c’est juste une jungle et un enfer.



L’article aborde juste le lancement d’un script au démarrage, mais parfois la config réseau, la config kerberos se complique car les docs ne sont pas à jour, pas centralisées et les tutos antédiluviens.



systemd n’est pas un mauvais système, c’est une vision différente, et il paye surtout d’avoir été long et compliqué à mettre en place pour remplacer sysinit (vu l’historique, pas de surprise, ça a tatonné un peu).



Par rapport à rc.d, systemd a un énorme avantage: il permet de décrire les dépendances. Dans rc.d on jouait sur les noms des fichiers pour déterminer l’ordre, là on est plus sur du service que de la technique pure. C’est plus proche de ce qu’on fait sous Windows (dire qu’un service dépend de tel ou tel autre pour qu’il démarre après).



Par contre mettre systemd sur un système embarqué, c’est très peu utile et relativement compliqué si sysv était déjà là.



On a donc toute la mémoire/amertume/rancoeur collective du produit qui a été mal utilisé/paramétré et a eu une courbe d’apprentissage/mise en place assez longue (donc c’est comme SAP, BO ou Sharepoint 20xx qui ne méritent pas la réputation que leur donnent les utilisateurs)



Petit plus de systemctl: la commande systemctl enable peut être lancée pour un utilisateur pour lancer des services quand il se logue (–user) ou pour tous les utilisateurs qui se loguent (–global)



David_L a dit:


Nooooooooooooooooooon :transpi:




Déjà juste l’introduction, ensuite expliquer la différence en vi et vim, et tu recommence avec pico nano, et pour finir expliquer comment lire ces e-mails dans emacs.
Après ça tu comprend l’utilité du mode psychologue d’emacs.



(quote:1910899:brice.wernet)
D’un autre côté, l’article met le doigt sur ce qui fâche. Quand on se retrouve à gérer plusieurs distro différentes car achetées avec des produits différents, Linux c’est juste une jungle et un enfer.




Oui mais ça n’est pas propre à ce sujet. C’est propre à la diversité de l’écosystème Linux et son incapacité (pour de bonnes ou de mauvaises raisons) à s’entendre sur des éléments de base comme ça a pu être fait à une époque. Pour moi le problème n’est pas tant la diversité des inits que de voir que tout le monde ne sait pas s’entendre sur l’emplacement du rc.local.




L’article aborde juste le lancement d’un script au démarrage, mais parfois la config réseau, la config kerberos se complique car les docs ne sont pas à jour, pas centralisées et les tutos antédiluviens.




Et encore, tu oublies les billets de blog pas datés, ceux avec juste des conseils de merde pas vérifiés (ou corrigés). Quand je fais ce genre de papier j’en mange des km et je pleure :D




Par contre mettre systemd sur un système embarqué, c’est très peu utile et relativement compliqué si sysv était déjà là.




Oui d’ailleurs tu vois que les distributions qui sont resté sur l’alternative, hors de celles qui le font par choix philosophique sont celles à faible empreinte (comme Alpine par exemple).




On a donc toute la mémoire/amertume/rancoeur collective du produit qui a été mal utilisé/paramétré et a eu une courbe d’apprentissage/mise en place assez longue (donc c’est comme SAP, BO ou Sharepoint 20xx qui ne méritent pas la réputation que leur donnent les utilisateurs)




C’est un sujet connu : la technique n’existe pas qu’à travers elle-même. Il faut aussi savoir accompagner les changements, gérer les évolutions, etc. Mais quoi que tu fasses, il y a aura aussi toujours des “anti”, c’est la base des forks sans fin. C’est aussi ce qui fait parfois la richesse d’un écosystème sur le long terme. Mais je suis d’avis que toute position doit se défendre avec respect, le problème sur ce sujet, c’est que ça n’a pas été le cas dans bien des situations.




ben51 a dit:


Déjà juste l’introduction, ensuite expliquer la différence en vi et vim, et tu recommence avec pico nano, et pour finir expliquer comment lire ces e-mails dans emacs. Après ça tu comprend l’utilité du mode psychologue d’emacs.




Ou tu résumes par “Utilisez emacs, il y a orgmode :D



David_L a dit:


Et encore, tu oublies les billets de blog pas datés, ceux avec juste des conseils de merde pas vérifiés (ou corrigés). Quand je fais ce genre de papier j’en mange des km et je pleure :D




Et nous t’en remercions :incline:


peut-être rajouter la commande “start” de systemctl, l’argument “–now” de enable et “daemon-reload” pour montrer comment tester le nouveau service sans avoir a reboot?



David_L a dit:


Oui d’ailleurs tu vois que les distributions qui sont resté sur l’alternative, hors de celles qui le font par choix philosophique sont celles à faible empreinte (comme Alpine par exemple).




J’allais évoquer l’exemple de la distribution Alpine, que j’ai découverte par ici, pour laquelle il est bon de connaître le fonctionnement de rc.local (et de init.d) quand on n’utilise plus que Debian la plupart du temps. Double merci, donc, pour Alpine d’une part, et pour ce chouette article d’autre part, dont le vernis historique est agréable également !


Je ne suis pas un grand “linuxien”… Je n’ai actuellement qu’un raspberry pi2 avec raspbian et pihole.
J’ai chercher un moyen de rebooter mon raspberry 1x par semaine, et les services pihole 1x/jour (à 4h00 du mat’!)
Une rapide recherche m’a fait paramétrer tout ça dans Crontab… simple et efficace!


Merci pour cet article @David_L Très clair.
C’est sympas d’avoir une overview comme avec en plus un peu “d’histoire”. et j’ai appris des trucs en plus :bravo:


Le pénible que je rencontre avec systemd, c’est quand un ficher de service change sur le disque, on a un avertissement “le service a change, daemon reload”, sauf que le service que j’ai écrit n’a pas changé, c’est un autre service qui a changé quelque part dans le système , la détection du changement est globale, le rechargement du démon aussi. :mad:


Tournant de plus en plus sous linux (Mint), sous forme de VM ou installé en dur, voilà des explications qui tombent bien. Maintenant, reste à lire avec attention !


Pour un script qui rend la main il me semble que Type=oneshot est plus adapté.


plutôt qu’utiliser le .bashrc qui est exécuté à chaque bash (c’est pas forcément ce qu’on veut et, en tout cas, pas de ce qu’on parle dans l’article), il vaut mieux utiliser le .profile (ou .bash_profile selon la distro) qui lui est exécuté à chaque connexion.


Ce qui est d’ailleurs mentionné dans l’article :D


Ben, justement non :langue: . Je ne vois nulle part .profile ou .bash_profile.


Ah oui, my bad, je parle de profile.d qui est recommandé plutôt que l’édition direct du .profile en général (mais ça peut dépendre des distributions).


C’est une des raisons qui m’ont fait abandonner ubuntu (en perso) , je voulais faire un truc simple : forcer la fréquence de rafraîchissement de l’écran à une valeur particulière. J’ai créer un script fonctionnel mais je ne suis jamais arriver à le lancer en automatique à l’ouverture de session (enfin après le moteur graphique, wayland je pense).



game1337 a dit:


C’est une des raisons qui m’ont fait abandonner ubuntu (en perso) , je voulais faire un truc simple : forcer la fréquence de rafraîchissement de l’écran à une valeur particulière. J’ai créer un script fonctionnel mais je ne suis jamais arriver à le lancer en automatique à l’ouverture de session (enfin après le moteur graphique, wayland je pense).




Habituellement, on utilise “paramètres > écrans” dans gnome pour ça. C’était quoi le contexte?


Ubuntu ne reconnaisait pas de fréquence autre que 60hz dans les paramètres, le seul moyen que j ai trouvé était une ligne de commande xranrd mais je perdais la modification à chaque boot


Merci pour l’article, bien pratique ; après, c’est dommage (mais en même temps, ça déborde un peu du sujet, et ça devient très vite très technique) de ne pas avoir des pistes pour aborder ce qui est (à mon avis) le plus intéressant et critique : le démarrage de ressources au login en passant les informations d’authentification via PAM. Il y a moyen de faire des choses très puissantes par ce biais (une authentification automatique à un VPN d’entreprise si l’adresse IP ne correspond pas à une adresse interne de la boîte, en faisant passer le mot de passe de session au script de connexion VPN, par exemple, ce qui permet ensuite de monter automagiquement des volumes partagés via le VPN et une authentification Samba ou Kerberos - toujours via PAM).



Bref, je fais mon gnan gnan, mais je mets ce tuto en favoris :3



David_L a dit:


(..)Et encore, tu oublies les billets de blog pas datés, ceux avec juste des conseils de merde pas vérifiés (ou corrigés). (…)




Combien de fois j’ai envie de brûler ceux qui disent de désactiver SELinux à la moindre contrariété au lieu d’ajouter la règle qui va bien…



SebGF a dit:


Combien de fois j’ai envie de brûler ceux qui disent de désactiver SELinux à la moindre contrariété au lieu d’ajouter la règle qui va bien…




Pareil… le jour où IBM est venu dans la boîte où je bossais pour fourguer ICO (IBM cloud orchestrator), une cochonnerie réalisée avec des cadavres d’openstack en décomposition avec lesquels une ghoule DB2 aurait commit des actes de nécrophilie…



Bref ,au final pour installer cette saleté sur RHEL7 , contrairement à un openstack normal où SElinux est obligatoire, il fallait désactiver SELinux…. en gros ils avaient viré MySQL pour mettre DB2 à la place mais avaient été incapables de garder le tout sécurisé ou même maintenable (moins d’un an plus tard le produit était retiré de la vente)


Du IBM dans toute sa splendeur :D



ben51 a dit:


Il y a de quoi en faire tout un article Magazine #4 des éditeurs de texte pour terminal.




:cap:


Je valide le cron @reboot : :ouioui:

ça évite toute prise de chou avec des services linux,
facile à éditer/modifier
et ça marche à tous les coups ! :yes:



(quote:1910922:Frédérick L.)
J’ai lu beaucoup d’échanges à ce sujet.




Oui, c’est un sujet assez clivant, le reproche est surtout sur le fait que ça peut faire plein de chose… (mais pas encore le café :D)



Je n’ai jamais rencontré de soucis avec systemd, hormis justement lors de bidouilles en suivant des tutos mal goupillés :mdr:



bilbonsacquet a dit:


Oui, c’est un sujet assez clivant, le reproche est surtout sur le fait que ça peut faire plein de chose… (mais pas encore le café :D)




Je suis sûr qu’en cherchant un peu tu trouveras un tuto expliquant comment réaliser une machine expresso pilotée par un Raspberry sur lequel un Linux utilise le planificateur de systemd. :D



En plus on pourrait même profiter du gestionnaire de dépendances, raccordé à des capteurs permettant de dire s’il y a assez d’eau et de grains dedans pour démarrer le service. Voire exploitant la réaction sur événement avec une sonde sur la personne mesurant le taux de caféine dans le sang et déclenchant la chaîne dès qu’elle atteint le taux critique.



Le Continuous Delivery dans toute sa magnificence :8



Cqoicebordel a dit:


Arrive systemd, qui est un monolithe, et qui fait des tonnes de choses en même temps.




C’est pourtant un projet modulaire qui fournit tout plein d’exécutables pour les différentes tâches à effectuer :



$ rpm -ql systemd | grep usr/bin
/usr/bin/busctl
/usr/bin/coredumpctl
/usr/bin/homectl
/usr/bin/hostnamectl
/usr/bin/journalctl
/usr/bin/localectl
/usr/bin/loginctl
/usr/bin/oomctl
/usr/bin/portablectl
/usr/bin/systemctl
/usr/bin/systemd-analyze
/usr/bin/systemd-ask-password
/usr/bin/systemd-cat
/usr/bin/systemd-cgls
/usr/bin/systemd-cgtop
/usr/bin/systemd-cryptenroll
/usr/bin/systemd-delta
/usr/bin/systemd-detect-virt
/usr/bin/systemd-dissect
/usr/bin/systemd-escape
/usr/bin/systemd-firstboot
/usr/bin/systemd-id128
/usr/bin/systemd-inhibit
/usr/bin/systemd-machine-id-setup
/usr/bin/systemd-mount
/usr/bin/systemd-notify
/usr/bin/systemd-path
/usr/bin/systemd-run
/usr/bin/systemd-socket-activate
/usr/bin/systemd-stdio-bridge
/usr/bin/systemd-sysext
/usr/bin/systemd-sysusers
/usr/bin/systemd-tmpfiles
/usr/bin/systemd-tty-ask-password-agent
/usr/bin/systemd-umount
/usr/bin/timedatectl
/usr/bin/userdbctl




Pourquoi systemd va à l’encontre de la philosophie de Linux ? C’est parce que Linux est construit sur le principe du KISS : keep it silly simple. Chaque application doit faire un seul job, et le faire bien. La grande majorité des commandes sur Linux prennent en entrée du texte, font leurs traitements, et ont en sortie du texte. C’est ce qui permet de “piper” ( ‘|’ ) les commandes entre elles, et de faire des trucs super puissants, en partant de choses simples. C’est la force de Linux, et c’est comme ça qu’il s’est construit pendant 20 ans.




Ce que permettent toujours les outils fournis par systemd :



$ systemd-analyze blame | head -n3
34.895s unbound.service
30.684s akmods.service
27.680s plymouth-quit-wait.service



$ timedatectl show | grep -i timezone | cut -d = -f2-
Europe/Paris



$ journalctl -b -1 | grep -i microcode
nov. 02 20:28:30 darthmaul kernel: microcode: microcode updated early to revision 0x28, date = 2019-11-12
nov. 02 20:28:30 darthmaul kernel: microcode: sig=0x306c3, pf=0x2, revision=0x28
nov. 02 20:28:30 darthmaul kernel: microcode: Microcode Update Driver: v2.2.



Il va falloir revoir tes arguments 😁


Comme dit, cette “guerre” n’a pas à se dérouler ici, remballez vos billes !


David_L

Comme dit, cette “guerre” n’a pas à se dérouler ici, remballez vos billes !


Tu noteras que j’ai essayé de faire mon explication en minimisant les jugements que je pouvais avoir dessus, pour éviter cette gueguerre, justement.



Je suis tout à fait d’accord avec toi (même si le scope de apt ou make est beaucoup plus restreint).



La cause principale du problème est juste la philosophie. Comme quand une distro incluait les packages pour décoder les codecs propriétaires. Qu’est ce qui compte ? Le côté libre/FOSS, ou l’UX pour l’utilisateur.

C’est complexe, parce que la majorité des utilisateurs sont passés à Linux pour le côté libre/FOSS, mais pour avoir plus d’utilisateurs, il faut que la facilité d’utilisation soit là, quel que soit le status des licences.



Bref, c’est un équilibre complexe à trouver, et personne ne sera jamais satisfait. Surtout quand on touche à la philosophie, qui est l’identité même de Linux, et qui donc pousse vers des débats enflammés :/


Cqoicebordel

Tu noteras que j’ai essayé de faire mon explication en minimisant les jugements que je pouvais avoir dessus, pour éviter cette gueguerre, justement.



Je suis tout à fait d’accord avec toi (même si le scope de apt ou make est beaucoup plus restreint).



La cause principale du problème est juste la philosophie. Comme quand une distro incluait les packages pour décoder les codecs propriétaires. Qu’est ce qui compte ? Le côté libre/FOSS, ou l’UX pour l’utilisateur.

C’est complexe, parce que la majorité des utilisateurs sont passés à Linux pour le côté libre/FOSS, mais pour avoir plus d’utilisateurs, il faut que la facilité d’utilisation soit là, quel que soit le status des licences.



Bref, c’est un équilibre complexe à trouver, et personne ne sera jamais satisfait. Surtout quand on touche à la philosophie, qui est l’identité même de Linux, et qui donc pousse vers des débats enflammés :/


Oui mais je sais où ça mène rapidement :D



Cqoicebordel a dit:


Arrive systemd, qui est un monolithe, et qui fait des tonnes de choses en même temps. Il les fait bien, hein, mais il n’empêche que c’est une grosse bête, compliquée à mettre en place, à configurer etc.




Comme apt ou make en fait. Avant on compilait et on linkait à la main. Et on tar-dégzippait les TGZ en allant chercher les bibliothèques à la main. Ca ne me manque pas. Les différents systèmes de packaging ont eu les mêmes guerres, et maintenant les systèmes comme flatpak ont la leur.



C’est le prix de la liberté de choix je crois.


Article très intéressant, merci beaucoup.



David_L a dit:


Oui mais je sais où ça mène rapidement :D




DTC ? :D




Désolé, tu as précisé de ne pas troller sur systemd et autres, mais pas sur ça :mad2:



:pastaper:


Un petit point important à noter, c’est que le support des dépendances par systemd permet de déterminer l’ordre de lancement automatiquement, au lieu de se baser sur le nommage des scripts d’init. La conséquence directe est que systemd peut lancer plusieurs services en parallèle si ils sont indépendants, et donc permet un démarrage plus rapide du système :)


merci



sur debian/ubuntu, j’utilise supervisor pour les scripts de type serveur (genre le npm start d’un daemon node)
j’utilise aussi la commande flock -m dans un crontab * pour executer un script perso ..
les 2 solutions ont l’avantage de redemarrer les scripts en cas de plantage


Merci pour cet article très complet !:yes:
Je n’ai jamais pu/cherché à trop comprendre les différences avec les autres distros. Voilà qui est réparé.
J’ai eu personnellement toujours un peu de mal à configurer systemd sous ma Fedora. Même si je m’en sors toujours au final, il me faut toujours reprendre la doc pour les liens etc.