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 genre de scripts (ou je dois?) ....
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 pour mes scripts!
Je vois une autre question demandant où est rc.local et la réponse a été de le créer et de donner des autorisations d'exécution, je pense que ma question n'est vraiment pas un doublon , parce que je ne veux pas savoir où elle est - croyez-moi, je veux juste d' accepter qu'il est obsolète , mais je ne trouve pas la bonne façon de faire ce genre de choses, devrais-je vraiment créer une unité juste pour quelques simples comme ça?
Réponses:
Comme indiqué ailleurs, il devient modérément impur à utiliser
rc-local.service
soussystemd
.poweroff
/reboot
commandes que beaucoup de gens utilisent).rc-local.service
une façon, 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: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 a une dépendance sur tout autre service, y compris
network-online.target
, vous devez le déclarer. Par exemple, ajoutez une[Unit]
section, avec les lignesWants=network-online.target
etAfter=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 auparavant
basic.target
. Les services commemy-startup.service
sont automatiquement commandés aprèsbasic.target
, sauf s'ils sont définisDefaultDependencies=no
.Si vous ne savez pas si l'une de vos dépendances est un service de «démarrage rapide», une approche consiste à répertorier les services qui sont commandés avant
basic.target
, en exécutantsystemctl list-dependencies --after basic.target
. (Notez que ce n'est--after
pas le cas--before
).Il y a quelques considérations qui, je pense, s'appliquent également à la version pré-système
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, quimy-startup
seront affichées comme "actives" une fois qu'elles seront terminées, et que vous ne démarrerez pas un démon.la source
.service
unité système native , ou si vous voulez vraiment écrire un script d'initialisation LSB, vous pouvez le faire à la place. Je ne voulais pas recommander de mettre plusieurs démons dansrc-local.service
ou équivalent, je pense que cela fonctionne probablement, mais cela semble beaucoup plus agréable si vous pouvez redémarrer le démon individuel avecsystemctl restart my-daemon
comme n'importe quoi d'autre. Il est prévu que vous mettiez vos services locaux/etc/systemd/system
.local-
...Type=oneshot
appelés démons à partir de rc.local. J'ai utilisé ... cela formalise que ... vous ne démarrerez pas un démon. Si vous souhaitez des informations sur le démarrage d'un démon, veuillez poser une nouvelle question.Oubliez
rc.local
.Comme je l'ai dit à propos de CentOS 7 et de Debian 8 et 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 système van Smoorenburg 5rc
clone .L'utilisation
/etc/rc.local
peut mal tourner. Les gens ont été surpris par le fait que systemd ne fonctionnerc.local
pas de la même manière, au même endroit dans le bootstrap, comme ils sont habitués. (Ou attendez-vous à tort: en fait, il ne fonctionnait pas en 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 mis en place enrc.local
s'attendant aux anciennes façons de faire, est puis complètement défaits par les goûts de nouvellesudev
règles, NetworkManager,systemd-logind
,systemd-resolved
ou divers « Kit » s.Comme illustré par « Pourquoi« init 0 »entraîne-t-il des« Arguments excédentaires »lors de l'installation d'Arch? », Certains systèmes d'exploitation fournissent déjà systemd sans les fonctionnalités de compatibilité descendante telles que le
systemd-rc-local-generator
générateur . Alors que Debian conserve toujours les fonctionnalités de compatibilité descendante , Arch Linux construit systemd avec elles désactivées . Ainsi, sur Arch et les systèmes d'exploitation comme celui-ci, ils/etc/rc.local
devraient être entièrement ignorés .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 a été supprimé à trois reprises, lerc
clone van Smoorenburg System 5 qui a suivirc.local
ayant ensuite été lui-même remplacé deux fois , il y a plus de dix ans, d'abord par un parvenu puis par systemd.)Souvenez-vous également de la première règle de migration vers systemd .
Ce n'est même pas une nouvelle idée spécifique à systemd. Sur les
rc
systèmes van Smoorenburg et Upstart, la chose à faire était de créer unrc
script van Smoorenburg ou un fichier de travail Upstart approprié plutôt que de l'utiliserrc.local
. Même le manuel de FreeBSD note qu'aujourd'hui, on crée unrc
script Mewburn approprié au lieu de l'utiliser/etc/rc.local
. Mewburn arc
été introduit par NetBSD 1.5 en 2000./etc/rc.local
date de l'époque de la septième édition Unix et avant. Il a été remplacé/etc/inittab
et basérc
sur un niveau d'exécution dans AT&T Unix System 3 (avec un peu différent/etc/inittab
dans AT&T Unix System 5) en 1983 . Même cela 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 l'ensemble d'outils Nosh
service-manager
etsystem-control
, d'un/etc/rc.d/
script pour Mewburnrc
, d'un fichier d'unité de service pour systemd, d'un fichier de travail pour Upstart, d'un répertoire de service pour runit / s6 / daemontools -encore, ou même un/etc/init.d/
script pour van Smoorenburgrc
.Dans systemd, ces fichiers d'unité de service ajoutés par l'administrateur entrent
/etc/systemd/system/
généralement (ou/usr/local/lib/systemd/system/
rarement). Avec le nosh service manager,/var/local/sv/
est un lieu conventionnel pour les bundles de services locaux. Mewburnrc
sur les utilisations de FreeBSD/usr/local/etc/rc.d/
. Les fichiers d'unité de service et les packs de services, si vous les créez, vont cependant à des endroits différents.Lectures complémentaires
rc.local
. Manuel du gestionnaire de système FreeBSD . 2016-04-23./etc/rc.local
ouchmod -x
il . 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
" Chemins de recherche système manquants dans la page de manuel ". Errata pour systemd doco . Réponses fréquemment données.la source
Résumé de https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd
Créez /etc/systemd/system/rc-local.service:
Ensuite:
Vérifier avec:
la source
StandardOutput=journal+console
(la console est équivalente à tty dans votre exemple), ce qui semble être beaucoup plus utile pour le dépannage. Le support deSysVStartPriority=
a également été supprimé à un moment donné. Peut-être pourriez-vous nous dire à quel pointSysVStartPriority=
c'est important ou le supprimer. En dehors de cela, c'est une réponse décente.