web-dev-qa-db-fra.com

Comment créer un service tant que dernier service au démarrage?

Il y a de nombreuses 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 sera exécuté.

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

Y a-t-il un moyen de le faire? Ou devons-nous utiliser Before et After dans le fichier de service systemd?

24
比尔盖子

Dans systemd, il est conseillé d'utiliser Before = et After = pour commander vos services en harmonie avec les autres.

Mais puisque vous avez demandé un moyen sans utiliser Avant et Après, vous pouvez utiliser:

Type=idle

qui comme man systemd.service explique

est très similaire à simple, toutefois l’exécution réelle du binaire de service est retardée jusqu’à ce que tous les travaux soient distribués. Cela peut être utilisé pour éviter l’entrelacement de la sortie des services Shell avec la sortie d’état sur la console.

25
SimonPe

Cela dépend vraiment de votre définition de "démarré". Je suppose que vous voulez qu'il soit exécuté immédiatement après le démarrage de getty. Pour ce faire, vous devez ajouter votre service au répertoire /etc/systemd/system/getty.target.wants/. Vous devez également vous assurer que votre fichier utilise un code similaire à celui des autres services de ce répertoire. Pour exécuter un service personnalisé au démarrage et à l’arrêt (émet simplement un bip sonore de la sonnerie de la 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 qu’il s’agit du point auquel l’invite de connexion apparaît pour 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 à la fois ExecStart= et ExecStop=, plutôt que d'être limité à un service semblable à Type=simple-.

0
Penn