Como eu crio um arquivo de unidade do systemd para definir o volume na inicialização?

1

/etc/systemd/system/volume.service

Esta é minha primeira tentativa de criar um arquivo de unidade.

[Unit]
Description="Set volume level."
After=sound.target

[Service]
Type=simple
ExecStart='/usr/bin/amixer sset PCM -- 97%'

[Install]
WantedBy=multi-user.target

Eu tive que atualizar os arquivos da unidade

systemctl daemon-reload

Eu tentei iniciar o volume.service

systemctl start volume

journalctl -xe revela:

systemd[1855]: volume.service: Failed at step EXEC spawning /usr/bin/amixer sset PCM -- 97%: No such file or directory
    
por Jonathan Komar 14.05.2017 / 10:39

2 respostas

1

As aspas simples na sua linha ExecStart são problemáticas:

ExecStart='/usr/bin/amixer sset PCM -- 97%'

De acordo com o systemd.service :

Double quotes ("…") and single quotes ('…') may be used, in which case everything until the next matching quote becomes part of the same argument.

Isso significa que você está dizendo ao systemd para executar /usr/bin/amixer sset PCM -- 97% em vez de /usr/bin/amixer com os argumentos sset , PCM , -- e 97% .

Remova as aspas simples:

ExecStart=/usr/bin/amixer sset PCM -- 97%

e sua unidade funcionará.

    
por 15.05.2017 / 17:37
0

Criar um arquivo unitário "drop-in"

Essa coisa possibilita a troca de arquivos unitários sem bagunçar a atualização (mudanças no upstream). Como os arquivos unitários não devem ser alterados significativamente (acordo coletivo aqui, suponho), um downstream espera-se que a mudança (drop-in) funcione durante muito tempo.

No meu caso, gostaria de alterar alsa-restore.service -especificamente ExecStart= part.

ExecStart=-@sbindir@/alsactl restore
  1. Crie uma pasta drop-in mkdir /etc/systemd/system/alsa-restore.d
  2. Defina o volume para o nível desejado. Salvar o estado do ALSA alsactl store -f /etc/systemd/system/alsa-restore.d/alsa-state
  3. Crie um arquivo de unidade drop-in que altere especificamente ExecStart=
  4. Crie um script, porque o ExecStart não pode aceitar argumentos. (executa exec ao invés de um shell: essa é a parte mais difícil para os novatos entenderem. Isso já foi alterado?)

/etc/systemd/system/alsa-restore.d/volume.conf

[Service]
ExecStart=/etc/systemd/system/alsa-restore.d/volume.sh

/etc/systemd/system/alsa-restore.d/volume.sh

#!/bin/sh
/usr/sbin/alsactl restore -f /etc/systemd/system/alsa-restore.d/alsa-state

Notas

por 15.05.2017 / 16:57