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?

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.