Cómo escribir un script de inicio para systemd

233

Tengo 2 tarjetas gráficas en mi computadora portátil. Uno es IGP y otro discreto.

He escrito un script de shell para apagar la tarjeta gráfica discreta.

¿Cómo puedo convertirlo a script systemd para ejecutarlo al inicio?

Sharique
fuente

Respuestas:

332

Hay principalmente dos enfoques para hacer eso:

  • Si tiene que ejecutar un script, no lo convierte sino que ejecuta el script a través de un systemdservicio.

Por lo tanto, necesita dos archivos: el script y el .servicearchivo (archivo de configuración de la unidad).
Asegúrese de que su script sea ejecutable y que la primera línea ( shebang ) lo sea #!/bin/sh. Luego cree el .servicearchivo en /etc/systemd/system(un archivo de texto plano, llamémoslo vgaoff.service).
Por ejemplo:

  1. la secuencia de comandos: /usr/bin/vgaoff
  2. el archivo de la unidad: /etc/systemd/system/vgaoff.service

Ahora, edite el archivo de la unidad. Su contenido depende de cómo funciona su script:

Si vgaoffsolo apaga el gpu, por ejemplo:

exec blah-blah pwrOFF etc 

entonces el contenido de vgaoff.servicedebería ser:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Si vgaoffse usa para apagar la GPU y también para volver a encenderla, por ejemplo:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

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

entonces el contenido de vgaoff.servicedebería ser:

[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
  • Para los casos más triviales, puede prescindir del script y ejecutar un determinado comando directamente:

Para apagar:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Para apagar y encender:

[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

Una vez que haya terminado con los archivos, habilite el servicio:

systemctl enable vgaoff.service

Se iniciará automáticamente en el próximo arranque. Incluso podría habilitar e iniciar el servicio de una vez con

systemctl enable --now vgaoff.service

a partir de systemd v.220(en configuraciones anteriores, deberá iniciarlo manualmente).
Para más detalles ver systemd.servicela página del manual.


Solución de problemas .
Comience aquí:
¿Cómo ver el registro completo de un systemdservicio?
systemdcódigos de salida de servicio y explicación de información de estado

don_crissti
fuente
Gracias por la respuesta detallada El script contiene un comando "echo OFF> / sys / kernel / debug / vgaswitcheroo / switch"
Sharique
falla con el siguiente mensaje vgaoff.service - Power-off gpu Cargado: cargado (/usr/lib/systemd/system/vgaoff.service; activado) Activo: fallido (Resultado: código de salida) desde el martes, 11 de septiembre de 2012 23: 46:46 +0530; Hace 30 años Proceso: 5258 ExecStart = / usr / lib / systemd / scripts / vgaoff (código = salido, estado = 203 / EXEC) CGroup: name = systemd: /system/vgaoff.service
Sharique
Uy, no otra vez, me perdí esta pequeña cosa, está funcionando bien ... gracias de nuevo.
Sharique
55
@Bazon: según esta lógica, miles de respuestas en este sitio son "trampas potenciales" para usuarios inexpertos. Las personas que no saben / entienden completamente lo que echo SOMETHING > /some/filehace (o cualquier otro comando de hecho) deben familiarizarse con los conceptos básicos de CLI antes de intentar ejecutar cosas en sus sistemas. Aparte de eso, para su información, lea cómo desactivar dGPU en varios modelos de computadoras portátiles, vea si los comandos utilizados allí podrían reemplazarse con algo como lo que sugiere. Además, para restaurar el archivo original, generalmente reinstala el paquete que lo posee.
don_crissti
44
@don_crissti whoops! gracias por el consejo. (borré mi comentario original para evitar la propagación de información engañosa)
Woodrow Barlow