Comment écrire un script de démarrage pour systemd

233

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?

Sharique
la source

Réponses:

332

Il y a principalement deux approches pour le faire:

  • Si vous devez exécuter un script, vous ne le convertissez pas, mais vous l'exécutez via un systemdservice.

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

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

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

Si vgaoffseulement éteint le gpu, par exemple:

exec blah-blah pwrOFF etc 

alors le contenu de vgaoff.servicedevrait être:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Si vgaoffest utilisé pour éteindre le GPU mais 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.servicedevrait ê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 allumer et éteindre:

[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 fois avec

systemctl enable --now vgaoff.service

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


Dépannage .
Commencez ici:
Comment voir le journal complet d'un systemdservice?
systemdcodes de sortie de service et explication des informations d'état

don_crissti
la source
Merci pour la réponse détaillée. Le script contient une commande "echo OFF> / sys / kernel / debug / vgaswitcheroo / switch"
Sharique
il échoue avec le message suivant vgaoff.service - Power-off gpu Chargé: chargé (/usr/lib/systemd/system/vgaoff.service; activé) Actif: échoué (Résultat: code de sortie) depuis le mardi 11 septembre 2012 23: 46:46 + 0530; Il y a 30s Processus: 5258 ExecStart = / usr / lib / systemd / scripts / vgaoff (code = quitté, status = 203 / EXEC) Groupe: name = systemd: /system/vgaoff.service
Sharique
oups, pas encore, j'ai raté cette petite chose, ça marche très bien .. merci encore.
Sharique
5
@Bazon - selon cette logique, des milliers de réponses sur ce site sont des "pièges potentiels" pour les utilisateurs inexpérimentés. Les personnes qui ne savent pas / ne comprennent pas bien ce qui est echo SOMETHING > /some/filefait (ou toute autre commande en fait) devraient se familiariser avec les bases de la CLI avant d’essayer d’exécuter des tâches sur leurs systèmes. Cela mis à part, Pour votre information, lisez comment passer dGPU off sur plusieurs modèles d'ordinateurs portables, voir si les commandes utilisées , il pourrait être remplacé par quelque chose comme vous le suggérez. En outre, pour restaurer le fichier d'origine, vous devez généralement réinstaller le package qui en est propriétaire.
don_crissti
4
@don_crissti whoops! Merci pour le conseil. (supprimé mon commentaire original pour éviter la propagation d'informations trompeuses.)
Woodrow Barlow