Comment faites-vous un service systemd comme dernier service au démarrage?

26

Il y a plusieurs années, nous pouvons écrire notre script de démarrage dans /etc/rc.local. Une fois tous les services système chargés, votre script s'exécutera.

Maintenant, nous utilisons systemd, nous n'en avons rc.localplus. Systemd démarre le service parallèle. Vous pouvez écrire votre propre service pour agir comme un rc.local` mais vous ne pouvez pas vous assurer qu'il fonctionnera après le chargement de tous les services système.

Y a-t-il un moyen de le faire? Ou nous devons utiliser Beforeet Afterdans le fichier de service systemd?

比尔 盖子
la source
5
Systemd, pas Upstart !!
比尔 盖子
Spécifiez le nom et la version du système d'exploitation?
STTR
Système d'
1
@ 比尔 盖子 Pourquoi "durer", ne connaissez-vous pas les dépendances du script, ou voulez-vous qu'il dure juste pour être sûr?
Paul

Réponses:

27

Dans systemd, il est conseillé d'utiliser Before=et After=de bien commander vos services autour des autres.

Mais puisque vous avez demandé un moyen sans utiliser Beforeet After, vous pouvez utiliser:

Type=idle

qui comme l' man systemd.serviceexplique:

Le comportement de idleest très similaire à simple; cependant, l'exécution réelle du programme de service est retardée jusqu'à ce que tous les travaux actifs soient envoyés. Cela peut être utilisé pour éviter l'entrelacement de la sortie des services shell avec la sortie d'état sur la console. Notez que ce type n'est utile que pour améliorer la sortie de la console, il n'est pas utile en tant qu'outil général de commande d'unités et l'effet de ce type de service est soumis à un délai d'expiration de 5 secondes, après quoi le programme de service est de toute façon appelé.

SimonPe
la source
1
Salut, voudriez-vous élaborer la syntaxe si je devais l'utiliser avant ou après?
r4ccoon
Sujet quelque peu différent, mais si quelqu'un veut exécuter des processus utilisateur distincts des processus système, il y a askubuntu.com/a/859583/457417
Ben Creasy
a parfaitement fonctionné ensemble à /proc/sys/kernel/modules_disabledla 1fin du processus de démarrage
Stuart Cardall
0

Cela dépend vraiment de votre définition de "démarré". Je suppose que vous voulez qu'il s'exécute immédiatement après le démarrage de getty. Pour ce faire, vous devez ajouter votre service au /etc/systemd/system/getty.target.wants/répertoire. Vous devez également vous assurer que votre fichier utilise un code similaire aux autres services de ce répertoire. Pour exécuter un service personnalisé au démarrage et à l'arrêt (émet simplement un bip sur le buzzer de ma carte mère), j'utilise le script suivant dans/etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh est exécutable et a un shebang au début.

Notez que tout ne sera pas démarré à ce stade du démarrage, mais c'est le point auquel l'invite de connexion apparaît à l'utilisateur

Bien que cela utilise Before=et After=, c'était pour moi beaucoup plus compréhensible et fonctionne réellement; Je n'ai pas trouvé la réponse ci-dessus suffisamment informative. Cela vous permet également d'utiliser les deux ExecStart=et ExecStop=, plutôt que d'être limité à un Type=simpleservice similaire.

Hack5
la source
-2

Je ne connais pas les détails ou ArchLinux, mais voici comment gérer systemd en général.

Eh bien, fondamentalement, systemd est une collection de scripts dans /etc/init.d/ qui sont pointés par des liens symboliques de /etc/rcX.d, où X est le nombre de niveaux d'exécution. Les liens symboliques eux-mêmes ont le format suivant:

[K | S] + nn + [chaîne]

où:

  • nn est un nombre qui détermine l'ordre dans lequel ces scripts s'exécutent
  • chaîne est le nom du script tel qu'il apparaît dans /etc/init.d/
  • et enfin K ou S déterminent la commande avec laquelle le script est appelé: stop ou start respectivement.

Donc, si vous souhaitez que votre script s'exécute en dernier dans la séquence de démarrage, vous devez procéder comme suit:

  1. mettez votre script dans /etc/init.d/ et rendez-le exécutable
  2. déterminer le niveau d'exécution cible à partir duquel le script doit démarrer (en général 2 pour la console et 5 pour l'interface utilisateur graphique). Peut être déterminé avec quelque chose commerunlevel
  3. jetez un œil aux scripts qui existent déjà dans ce niveau d'exécution ls /etc/rc<target runlevel>.d/et choisissez un nombre à deux chiffres supérieur à tout autre déjà existant.
  4. en utilisant un utilitaire spécifique à votre distribution comme update-rc.dpour Debian ou chkconfigpour Fedora ou manuellement, créez un lien symbolique /etc/rc.d/S vers votre script init.
Pavel A
la source
5
Ce que vous avez décrit est en fait sysVinit. S'il est vrai que systemd est compatible avec le fonctionnement de sysVinit, il y a une différence clé - tout est exécuté en parallèle. Il existe également deux types de services, les services sysVinit et les services systemd. Votre réponse peut aider quelque chose à s'exécuter après les services sysVinit, mais pas nécessairement ceux systemd.
Sam
1
Systemd ne vise pas du tout à être compatible avec sysvinit, dès le premier jour.
lzap