web-dev-qa-db-fra.com

Quel est le substitut correct de rc.local dans systemd au lieu de recréer rc.local

Je ne trouve pas la bonne façon d'exécuter certains scripts locaux (ou des commandes très locales) sur systemd, je sais déjà que je ne dois pas créer de service (dans systemd une unité) pour ce type de scripts (ou je doit?)....

La solution de contournement que j'ai trouvée est de créer rc.local et de lui donner des autorisations d'exécution.

printf '#!/bin/bash \n\nexit 0' >/etc/rc.local 
chmod +x /etc/rc.local

Par exemple, si j'obtiens un serveur hérité avec un simple rc.local configuré par vous, je saurai ce que vous avez fait et combien ça va faire mal de mettre à niveau ou d'installer quelque chose de nouveau sur la distribution, car rc.local a été respecté par les externes packages, mais d'autre part si j'installe un serveur et crée une unité systemd ou deux ou trois (ou même des services sysvinit), juste pour faire une tâche simple, cela peut parfois vous rendre la vie plus difficile, et bien plus que cela mes unités les noms peuvent un jour entrer en conflit avec les noms des nouveaux services créés par le développement de la distribution, et peuvent être installés sur une mise à niveau, causant des problèmes à mes scripts!

Je vois ne autre question poser des questions sur où est rc.local et la réponse était de le créer et de donner des autorisations d'exécution, je pense que ma question est vraiment pas = a duplicate, parce que je ne veux pas savoir où il est - croyez-moi, je veux juste accepter que c'est obsolète, mais je ne peux pas trouver la bonne façon de faire ce genre de choses, dois-je vraiment créer une unité juste pour quelques simples comme ça?

30

Comme indiqué ailleurs, il devient modérément impur d'utiliser rc-local.service sous systemd.

  1. Il est théoriquement possible que votre distribution ne le permette pas. (Je pense que ce n'est pas courant, par exemple parce que la désactivation de la même option de construction supprime également les commandes poweroff/reboot que beaucoup de gens utilisent).
  2. La sémantique n'est pas entièrement claire. Systemd définit rc-local.service dans un sens, mais Debian fournit un fichier de dépôt qui modifie au moins un paramètre important.

rc-local.service peut souvent bien fonctionner. Si vous vous inquiétez de ce qui précède, il vous suffit d'en faire votre propre copie! Voici la magie:

# /etc/systemd/system/my-startup.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/my-startup-script

[Install]
WantedBy=multi-user.target

Je ne pense pas que vous ayez besoin de comprendre chaque détail [*], mais il y a deux choses que vous devez savoir ici.

  1. Vous devez l'activer avec systemctl enable my-startup.service.

  2. Si votre script dépend d'un autre service, notamment network-online.target, vous devez le déclarer. Par exemple. ajouter un [Unit] section, avec les lignes Wants=network-online.target et After=network-online.target.

    Vous n'avez pas à vous soucier des dépendances des services de "démarrage précoce" - en particulier, les services qui sont déjà commandés avant basic.target. Des services comme my-startup.service sont automatiquement commandés après basic.target, sauf s'ils définissent DefaultDependencies=no.

    Si vous n'êtes pas sûr que l'une de vos dépendances soit un service de "démarrage rapide", une approche consiste à répertorier les services commandés avant basic.target, en exécutant systemctl list-dependencies --after basic.target. (Notez que c'est --after, ne pas --before).

Il y a quelques considérations qui, je pense, s'appliquent également à la version pré-systemd rc.local:

  1. Vous devez vous assurer que vos commandes n'entrent pas en conflit avec un autre programme qui essaie de contrôler la même chose.
  2. Il est préférable de ne pas démarrer de programmes de longue durée appelés démons à partir de rc.local.

[*] J'ai utilisé Type=oneshot + RemainAfterExit=yes car cela a plus de sens pour la plupart des scripts one-shot. Il formalise que vous exécuterez une série de commandes, que my-startup sera affiché comme "actif" une fois terminé et que vous ne démarrerez pas de démon.

19
sourcejedi

Oubliez rc.local.

Comme j'ai dit à propos de CentOS 7 et à propos de Debian 8 et à propos d'Ubuntu 15 :

Vous utilisez un système d'exploitation systemd + Linux. /etc/rc.local Est un mécanisme de double compatibilité descendante dans systemd, car il s'agit d'un mécanisme de compatibilité descendante pour un mécanisme qui était lui-même un mécanisme de compatibilité dans le clone van Smoorenburg System 5 rc.

L'utilisation de /etc/rc.local Peut mal tourner. Les gens ont été surpris par le fait que systemd ne s'exécute pas rc.local De la même manière, à peu près au même endroit dans le bootstrap, comme d'habitude. (Ou attendez-vous à tort: ​​en fait, il n'exécutait pas dernier dans l'ancien système, comme le souligne encore le manuel d'OpenBSD.) D'autres ont été surpris par le fait que ce qu'ils ont configuré dans rc.local S'attendant aux anciennes façons de faire, est alors complètement annulé par les nouvelles règles de udev, NetworkManager, systemd-logind, systemd-resolved, Ou divers " Kit "s.

Comme illustré par " Pourquoi` init 0` donne-t-il lieu à "Excess Arguments" lors de l'installation d'Arch? ", certains systèmes d'exploitation fournissent déjà systemd sans les fonctionnalités de compatibilité descendante - comme le générateur systemd-rc-local-generator . Alors que Debian conserve toujours les fonctionnalités de compatibilité descendante , Arch Linux construit systemd avec eux désactivés . Donc, sur Arch et les systèmes d'exploitation comme celui-ci, attendez-vous à ce que /etc/rc.local soit entièrement ignoré.

Oubliez rc.local. Ce n'est pas la voie à suivre. Vous avez un système d'exploitation systemd + Linux. Faites donc une unité de service systemd appropriée et ne partez pas d'un point qui est à deux niveaux de compatibilité descendante. (Sur Ubuntu et Fedora, il est trois fois supprimé, le clone van Smoorenburg System 5 rc qui a suivi rc.local Ayant ensuite été lui-même deux fois a été remplacé, il y a plus d'une décennie, d'abord par upstart puis par systemd.)

N'oubliez pas non plus la première règle de migration vers systemd .

Ce n'est même pas une nouvelle idée spécifique à systemd. Sur les systèmes van Smoorenburg rc et Upstart, la chose à faire était de créer un script van Smoorenburg rc ou un fichier de travail Upstart approprié plutôt que d'utiliser rc.local. Même le manuel de FreeBSD note que de nos jours on crée un script Mewburn rc approprié au lieu d'utiliser /etc/rc.local. Mewburn rc a été introduit par NetBSD 1.5 en 2000.

/etc/rc.local Date de la septième édition d'Unix et avant. Il a été remplacé par /etc/inittab Et un rc basé sur le niveau d'exécution dans AT&T Unix System 3 (avec un /etc/inittab Légèrement différent dans AT&T Unix System 5) en 1983 . Même ça appartient désormais à l'histoire.

Créez des définitions de service natives appropriées pour votre système de gestion des services, qu'il s'agisse d'un ensemble de services pour le jeu d'outils Nosh service-manager Et system-control, Un script /etc/rc.d/ Pour Mewburn rc, un fichier d'unité de service pour systemd, un fichier de travail pour Upstart, un répertoire de service pour runit/s6/daemontools-encore, ou même un script /etc/init.d/ pour van Smoorenburg rc.

Dans systemd, ces fichiers d'unité de service ajoutés par l'administrateur vont généralement dans /etc/systemd/system/ (Ou /usr/local/lib/systemd/system/ Rarement). Avec le gestionnaire de services nosh, /var/local/sv/ Est un endroit classique pour les bundles de services locaux. Mewburn rc sur FreeBSD utilise /usr/local/etc/rc.d/. Emballé les fichiers d'unité de service et les ensembles de services, si vous les créez, allez à différents endroits, cependant.

Lectures complémentaires

15
JdeBP

Résumé de https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd

Créez /etc/systemd/system/rc-local.service:

# /etc/systemd/system/rc-local.service
[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
 RemainAfterExit=yes
 SysVStartPriority=99

[Install]
 WantedBy=multi-user.target

Alors:

Sudo touch /etc/rc.local
Sudo chmod +x /etc/rc.local
Sudo systemctl enable rc-local

Vérifier avec:

Sudo systemctl start rc-local.service
Sudo systemctl status rc-local.service
2
Ole Tange