systemdでのサービスとしてのActkbd


12

しばらく前に、画面がロックされているときに音楽プレーヤーを停止する方法を尋ねました。答えは、魅力のように機能するactkbdを使用することでした。起動時に自動的に起動するために、actkbdをsystemdのサービスとして追加したかったのです。そのため、サービスが正しく開始され、htopにも表示されることがわかります。以下の出力:

[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

私は次のactkbd.serviceファイルを持っています/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

したがって、問題は、systemctlでサービスを開始した後、Rhythmboxを一時停止するための通常のショートカットを押しても何も起こらないということです。私が代わりに/usr/local/sbin/actkbd -d /dev/input/event3 -Dルート端末を介してコマンドを実行するだけであれば、すべて正常に動作します。どうして?

明らかなことであれば申し訳ありませんが、私はシステム化されたビジネスには慣れていませんが、私を助けてくれるものは見つかりませんでした。

乾杯。

編集:これはまだ動作していません。誰かが時間があれば、それを試して再現できるとありがたいです。それが可能であれば、バグレポートを提出します。


私が試してみ至っていないactkbdsystemd、時間が不足しているため、私はあなたの問題はとは何かがある可能性があるactkbd入力システムが完全に初期化される前に開始されている- actkbd私の開発のラップトップ上のLSBをサービスとして開始した場合、罰金を動作しますが。evdevモジュールの起動後に起動すること、およびキーボードのeventXデバイスノードが常に同じであることを確認する必要があります。
-thkala

返信Theodorosをありがとう。上記で示したテストは、すべてが起動されている間に実行されました。そのため、理論的にはすべてのモジュールをロードする必要があります。コマンドを手動で実行すると常に正常に機能するため、デバイスノードも正常である必要があります。
-Azrael3000

回答:


5

ユーザーがデバイスにアクセスしてサービスユニットを実行できるようにする場合は、デバイスにアクセスするためのユーザーアクセス許可を許可するudevルールを作成し、適切MODESに設定する必要があります。User=rootセッションをルートとしてではなくユーザーとして実行しているため、ユニットファイルを単純に起動するのは正しくありません。ルート端末から実行すると、ユーザーセッション内からルート端末がアクティブになります。詳細については、の情報を参照してくださいsystemd --user

udevルールをまとめる

次のコマンドを使用して、udevルールを設定するために必要な情報を提供します。

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

上記のコマンドの出力から、でudevルールを作成します/etc/udev/rules.d/<device>.conf。お気に入りのテキストエディターで開き、変数を入力します

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

udevルールの作成と命名の詳細については、man udevLinuxディストリビューションのWikiをご覧ください。ルールを設定したら、再起動します。そして、Xにログインしたらユニットを起動します。

また、ここに提供したシステムユニットファイルよりもはるかに健全なシステムユニットファイルを示します。

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

[Service]
ExecStart=/usr/sbin/actkbd -Dd /dev/input/event3
RemainAfterExit=yes
Type=forking
Restart=always
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.