
Há algum tempo perguntei como parar um reprodutor de música enquanto a tela está bloqueada. A resposta foi usar o actkbd, que funciona perfeitamente. Agora eu queria adicionar o actkbd como um serviço ao systemd para iniciá-lo automaticamente durante a inicialização. Como você pode ver, o serviço foi iniciado corretamente e também aparece no htop. Algumas saídas abaixo:
[root@hostname init.d]# systemctl start actkbd.service
[root@hostname init.d]# systemctl status actkbd.service
actkbd.service - Actkbd: Daemon for X-independent shortcuts
Loaded: loaded (/etc/systemd/system/multi-user.target.wants/actkbd.service)
Active: active (running) since Tue, 10 Apr 2012 17:50:36 +0200; 2s ago
Process: 23526 ExecStart=/usr/local/sbin/actkbd -d /dev/input/event3 -D (code=exited, status=0/SUCCESS)
Main PID: 23527 (actkbd)
CGroup: name=systemd:/system/actkbd.service
└ 23527 /usr/local/sbin/actkbd -d /dev/input/event3 -D
[root@hostname init.d]# systemctl stop actkbd.service
[root@hostname init.d]# ps -C actkbd
PID TTY TIME CMD
Eu tenho o seguinte actkbd.service
arquivo em/etc/systemd/system/multi-user.target.wants/
[Unit]
Description=Actkbd: Daemon for X-independent shortcuts
[Service]
Type=forking
ExecStart=/usr/local/sbin/actkbd -d /dev/input/event3 -D
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -15 $MAINPID
Restart=always
User=root
Então o problema é que depois de iniciar o serviço com systemctl nada acontece se eu pressionar meu atalho habitual para pausar o Rhythmbox. Se eu apenas executar o comando /usr/local/sbin/actkbd -d /dev/input/event3 -D
através de um terminal raiz, tudo funcionará bem. Porquê isso?
Desculpe se é algo óbvio, sou novo no ramo de systemd, mas não consegui encontrar nada que me ajudasse.
Saúde.
EDITAR: Isso ainda não está funcionando. Se alguém tiver algum tempo, eu apreciaria se alguém pudesse tentar reproduzi-lo. Se isso for possível, enviarei um relatório de bug.
Responder1
Se desejar que o usuário possa acessar o dispositivo e executar a unidade de serviço, você precisará criar uma udev
regra e definir a MODES
permissão adequada para permitir que o usuário acesse o dispositivo. Simplesmente iniciar o arquivo da unidade como User=root
está incorreto, pois você não está executando a sessão como root, mas como seu usuário. Ao executá-lo a partir de um terminal raiz, você está ativando um terminal raiz de dentro da sessão do usuário. Para obter mais informações sobre isso, procure informações em systemd --user
.
Montando uma regra do udev
Use o seguinte comando para fornecer as informações necessárias para preencher a udev
regra:
udevadm info --path=$(udevadm info -q path -n /dev/input/event3)
A partir da saída do comando acima, crie sua regra do udev no formato /etc/udev/rules.d/<device>.conf
. Abra-o no seu editor de texto favorito e preencha as variáveis
SUBSYSTEM=="device",
SYSFS{idVendor}=="ID Vendor Here" ,
SYSFS{idProduct}=="ID Model Here",
MODE="666"
Para obter mais informações sobre como criar e nomear udev
regras, dê uma olhada no man udev
Wiki da sua distribuição Linux. Depois de definir as regras, reinicie. E então inicie a unidade uma vez logado no X.
Além disso, aqui está ummuitoarquivo de unidade de sistema mais lógico do que aquele que você forneceu.
[Unit]
Description=Actkbd: Daemon for X-independent shortcuts
[Service]
ExecStart=/usr/sbin/actkbd -Dd /dev/input/event3
RemainAfterExit=yes
Type=forking
Restart=always