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?
Comme indiqué ailleurs, il devient modérément impur d'utiliser rc-local.service
sous systemd
.
poweroff
/reboot
que beaucoup de gens utilisent).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.
Vous devez l'activer avec systemctl enable my-startup.service
.
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
:
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.
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.
rc.local
. Manuel du gestionnaire de système FreeBSD. 2016-04-23./etc/rc.local
Ou chmod -x
It. Bogue Redhat # 734268.rc.local
Commence trop tôt. bogue systemd # 7703rc.local
. Bencane .com./etc/inittab
Appartient au passé. . Réponses fréquemment données.systemd.unit
". Errata pour doc doc systemd. Réponses fréquemment données.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