Então eu escrevi um arquivo de serviço systemd para Manjaro Linux executar dois comandos shell para definir alguns parâmetros do kernel em tempo de execução para permitir ações personalizadas de economia de energia.
BTW: Esta foi uma dica de uma revista alemã de informática.
Originalmente eu deveria colocar os comandos shell no arquivo /etc/rc.local
, mas eu quero fazer isso com um serviço systemd.
Porque rc.local
é considerado obsoleto e quero aprender algo novo.
Abaixo, você vê meu arquivo de serviço salvo como /etc/systemd/system/power-savings.service
.
Como há duas diretivas ExecStart
, escolhi Type=oneshot
.
[Unit]
Description=Enable custom power saving actions provided by c't magazine
# Quelle(n): c't 25/2016, S. 77
# c't 26/2016, S. 12
[Service]
Type=oneshot
# SATA Link Power Management aktivieren
ExecStart=/usr/bin/sh -c 'for I in /sys/class/scsi_host/host?/link_power_management_policy; do echo min_power > $I; done'
# Energieverwaltung für den Audiocodec aktivieren
ExecStart=/usr/bin/sh -c 'echo 1 > /sys/module/snd_hda_intel/parameters/power_save'
[Install]
WantedBy=multi-user.target
Eu verifiquei o arquivo de serviço com:
$ sudo systemd-analyze verify /etc/systemd/system/power-savings.service
Então eu recarreguei o daemon com:
$ sudo systemctl daemon-reload
Eu habilitei com:
$ sudo systemctl enable power-savings.service
Em seguida, executei o serviço com:
$ sudo systemctl start power-savings.service
E funcionou!
Os parâmetros do kernel foram definidos.
Mas depois de reiniciar o sistema, o serviço parece não ter nenhum efeito.
Embora o status do serviço tenha dito sucesso ...
$ systemctl status power-savings.service
Process: 412 ExecStart=/usr/bin/bash -c echo 1 > /sys/module/snd_hda_intel/parameters/power_save (code=exited, status=0/SUCCESS)
Process: 404 ExecStart=/usr/bin/bash -c for I in /sys/class/scsi_host/host?/link_power_management_policy; do echo min_power > $I; done (code=exited, status=0/SUCCESS)
Main PID: 412 (code=exited, status=0/SUCCESS)
Mas o parâmetro do kernel não foi definido.
Então, meu serviço funciona somente durante uma sessão do usuário.
Infelizmente, não durante a inicialização do sistema, como pretendia funcionar.
Existe algo que eu possa ter perdido?
Preciso de algumas dessas diretivas After
ou Require
?
Como posso depurar o que realmente acontece com as diretivas ExecStart
?