Actkbd jako usługa z systemd


12

Jakiś czas temu zapytałem, jak zatrzymać odtwarzacz muzyki, gdy ekran jest zablokowany. Odpowiedzią było użycie actkbd, który działa jak urok. Teraz chciałem dodać actkbd jako usługę do systemd, aby uruchomić ją automatycznie podczas uruchamiania. Jak widać, usługa została uruchomiona poprawnie i pojawia się również w htopie. Niektóre dane wyjściowe poniżej:

[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

Mam następujący actkbd.serviceplik/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

Problem polega na tym, że po uruchomieniu usługi z systemctl nic się nie dzieje po naciśnięciu mojego zwykłego skrótu do wstrzymania Rhythmbox. Jeśli zamiast tego po prostu wykonam polecenie /usr/local/sbin/actkbd -d /dev/input/event3 -Dza pomocą terminala głównego, wszystko działa dobrze. Dlaczego to?

Przepraszam, jeśli to coś oczywistego, jestem nowy w branży systemowej, ale nie mogłem znaleźć niczego, co mi pomogło.

Twoje zdrowie.

EDYCJA: To nadal nie działa. Jeśli ktoś ma trochę czasu, doceniłbym to, gdyby można było spróbować go odtworzyć. Jeśli to możliwe, wyślę raport o błędzie.


Muszę jeszcze spróbować, actkbdz systemdpowodu braku czasu, ale podejrzewam, że twój problem ma coś wspólnego z actkbduruchomieniem, zanim system wejściowy zostanie w pełni zainicjowany - actkbddziała dobrze po uruchomieniu jako usługa LSB na moim laptopie programistycznym. Należy upewnić się, że jest uruchamiany po uruchomieniu evdevmodułu i że klawiatura ma zawsze ten sam eventXwęzeł urządzenia.
thkala

Dzięki za odpowiedź Theodoros. Testy, które pokazałem powyżej, zostały wykonane, gdy wszystko zostało uruchomione. Teoretycznie wszystkie moduły powinny zostać załadowane. Węzeł urządzenia również powinien być w porządku, ponieważ ręczne wykonanie polecenia działa cały czas poprawnie.
Azrael3000

Odpowiedzi:


5

Jeśli chcesz, aby użytkownik mógł uzyskać dostęp do urządzenia i uruchomić jednostkę serwisową, musisz wprowadzić udevregułę i ustawić odpowiednią MODESopcję, aby zezwolić użytkownikowi na dostęp do urządzenia. Po prostu uruchomienie pliku jednostki, ponieważ User=rootjest niepoprawne, ponieważ nie uruchamiasz sesji jako root, ale jako użytkownik. Po uruchomieniu z terminala głównego aktywujesz terminal główny z poziomu sesji użytkowników. Aby uzyskać więcej informacji na ten temat, wyszukaj informacje na systemd --user.

Złożenie razem zasady udev

Użyj następującego polecenia, aby uzyskać informacje potrzebne do wypełnienia udevreguły:

udevadm info --path=$(udevadm info -q path -n /dev/input/event3)

Z danych wyjściowych powyższego polecenia utwórz regułę udev w /etc/udev/rules.d/<device>.conf. Otwórz go w swoim ulubionym edytorze tekstu i wypełnij zmienne

 SUBSYSTEM=="device",
 SYSFS{idVendor}=="ID Vendor Here" ,
 SYSFS{idProduct}=="ID Model Here",
 MODE="666"

Aby uzyskać więcej informacji na temat tworzenia i nazewnictwa udevreguł, zajrzyj na man udevWiki twojej dystrybucji Linuksa. Po ustawieniu reguł uruchom ponownie. A następnie uruchom urządzenie po zalogowaniu do X.

Ponadto, tutaj jest znacznie bardziej rozsądny plik jednostki systemowej niż ten, który podałeś.

[Unit]
Description=Actkbd: Daemon for X-independent shortcuts

[Service]
ExecStart=/usr/sbin/actkbd -Dd /dev/input/event3
RemainAfterExit=yes
Type=forking
Restart=always
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.