web-dev-qa-db-fra.com

Comment écrire un script de démarrage pour systemd

J'ai 2 cartes graphiques sur mon ordinateur portable. L'un est IGP et un autre discret.

J'ai écrit un script Shell pour désactiver la carte graphique discrète.

Comment puis-je le convertir en script systemd pour l'exécuter au démarrage?

236
Sharique

Pour ce faire, il existe principalement deux approches:

  • Si vous devez exécuter un script, vous ne le convertissez pas mais exécutez plutôt le script via un service systemd.

Vous avez donc besoin de deux fichiers: le script et le .service fichier (fichier de configuration de l'unité).
Assurez-vous que votre script est exécutable et que la première ligne (le Shebang ) est #!/bin/sh. Créez ensuite le .service fichier dans /etc/systemd/system (un fichier texte, appelons-le vgaoff.service).
Par exemple:

  1. le scénario: /usr/bin/vgaoff
  2. le fichier d'unité: /etc/systemd/system/vgaoff.service

Maintenant, éditez le fichier d'unité. Son contenu dépend du fonctionnement de votre script:

Si vgaoff éteint simplement le GPU, par exemple:

exec blah-blah pwrOFF etc 

alors le contenu de vgaoff.service devrait être:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff

[Install]
WantedBy=multi-user.target

Si vgaoff est utilisé pour éteindre le GPU et aussi pour le rallumer, par exemple:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

case $1 in
  start|stop) "$1" ;;
esac

alors le contenu de vgaoff.service devrait être:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff start
ExecStop=/usr/bin/vgaoff stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  • Pour les cas les plus triviaux, vous pouvez vous passer du script et exécuter directement une certaine commande:

Pour éteindre:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"

[Install]
WantedBy=multi-user.target

Pour éteindre et rallumer:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"
ExecStop=/bin/sh -c "echo ON > /whatever/vga_pwr_gadget/switch"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Une fois que vous avez terminé avec les fichiers, activez le service:

systemctl enable vgaoff.service

Il démarrera automatiquement au prochain démarrage. Vous pouvez même activer et démarrer le service en une seule fois avec

systemctl enable --now vgaoff.service

à partir du systemd v.220 (sur les anciennes configurations, vous devrez le démarrer manuellement).
Pour plus de détails, voir systemd.service page de manuel.


Dépannage .
Commencer ici:
Comment voir le journal complet d'un service systemd?
systemd codes de sortie de service et explication des informations d'état

340
don_crissti