Como escrever um script de inicialização para systemd

233

Eu tenho 2 placas gráficas no meu laptop. Um é IGP e outro discreto.

Eu escrevi um script de shell para desligar a placa gráfica discreta.

Como posso convertê-lo em script systemd para executá-lo na inicialização?

Sharique
fonte

Respostas:

332

Existem principalmente duas abordagens para fazer isso:

  • Se você precisar executar um script, não o converte, mas execute o script por meio de um systemdserviço.

Portanto, você precisa de dois arquivos: o script e o .servicearquivo (arquivo de configuração da unidade).
Verifique se o seu script é executável e a primeira linha (o shebang ) é #!/bin/sh. Em seguida, crie o .servicearquivo /etc/systemd/system(um arquivo de texto sem formatação, vamos chamá-lo vgaoff.service).
Por exemplo:

  1. o script: /usr/bin/vgaoff
  2. o arquivo da unidade: /etc/systemd/system/vgaoff.service

Agora, edite o arquivo da unidade. Seu conteúdo depende de como seu script funciona:

Se vgaoffapenas desligar o gpu, por exemplo:

exec blah-blah pwrOFF etc 

então o conteúdo de vgaoff.servicedeve ser:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Se vgaofffor usado para desligar a GPU e também para ligá-la novamente, por exemplo:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

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

então o conteúdo de vgaoff.servicedeve 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 os casos mais triviais, você pode ficar sem o script e executar um determinado comando diretamente:

Para desligar:

[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 desligar e ligar:

[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

Depois de concluir os arquivos, ative o serviço:

systemctl enable vgaoff.service

Ele será iniciado automaticamente na próxima inicialização. Você pode até ativar e iniciar o serviço de uma só vez com

systemctl enable --now vgaoff.service

a partir de systemd v.220(em configurações mais antigas, você terá que iniciá-lo manualmente).
Para mais detalhes, consulte systemd.servicea página do manual.


Solução de problemas .
Comece aqui:
Como ver o log completo de um systemdserviço?
systemdcódigos de saída de serviço e explicação das informações de status

don_crissti
fonte
Obrigado pela resposta detalhada. O script contém um comando "echo OFF> / sys / kernel / debug / vgaswitcheroo / switch"
Sharique
falha com a seguinte mensagem vgaoff.service - Desligar a gpu Carregado: carregado (/usr/lib/systemd/system/vgaoff.service; ativado) Ativo: falhou (resultado: código de saída) desde terça-feira, 11 de setembro de 2012 23: 46:46 +530; 30s atrás Process: 5258 ExecStart = / usr / lib / systemd / scripts / vgaoff (código = encerrado, status = 203 / EXEC) CGroup: name = systemd: /system/vgaoff.service
Sharique
oops, não de novo, eu perdi essa coisinha, está funcionando bem .. obrigado novamente.
Sharique
5
@Azon - de acordo com essa lógica, milhares de respostas neste site são "armadilhas em potencial" para usuários inexperientes. Pessoas que não sabem / compreendem completamente o echo SOMETHING > /some/fileque (ou qualquer outro comando, de fato) devem se familiarizar com o básico da CLI antes de tentar executar coisas em seus sistemas. Além disso, FYI, leia como desativar a dGPU em vários modelos de laptops, veja se os comandos usados ​​lá podem ser substituídos por algo como você sugere. Além disso, para restaurar o arquivo original, você geralmente reinstala o pacote que o possui.
31513 don_crissti
4
@don_crissti whoops! Obrigado pela dica. (suprimido o meu comentário original para evitar a propagação de informação enganosa.)
Woodrow Barlow