web-dev-qa-db-ja.com

systemdサービスをトリガーするudevルール

作業中のudevルールを変更しています(/etc/udev/rules.d/10-local.rules):

SUBSYSTEM=="tty", ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1015", ATTRS{serial}=="000621000000", SYMLINK+="ttymkw"

これに(行の終わり):

SUBSYSTEM=="tty", ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1015", ATTRS{serial}=="000621000000", SYMLINK+="ttymkw", TAG+="systemd", SYSTEMD_WANTS="offnet-uart-log.service"

offnet-uart-log.serviceにユーザーサービス~/.config/systemd/userがあり、手動でトリガーできますが、まだここまで到達していません。

Udevルールの最後に, TAG+="systemd", SYSTEMD_WANTS="offnet-uart-log.service"が追加されているため、シンボリックリンクは作成されません(Sudo udevadm control --reload-rules && Sudo udevadm triggerでリロードします)。

これはルールが間違っていることを教えてくれますが、理由はわかりません。サービスがユーザーによって所有されているのに対し、udevがrootによって所有されていることに関連している可能性がありますか? WANTSを誤解しましたか?

SYSTEM_USER_WANTSまたはSYSTEM_WANTSと、=または+=の4つの組み合わせすべてを試しました。 *_WANTSを削除するとシンボリックリンクが表示されるため、エラーは*_WANTSにあります。

Ttyデバイスでログサービスをトリガーするにはどうすればよいですか?


編集:以下の私自身の回答で述べたように、SYSTEM_USER_WANTSENV{SYSTEM_USER_WANTS}に変更すると機能します。なぜそれが必要なのですか?

1
Gauthier

このブログ投稿 私がやりたいことをします。そのおかげで、SYSTEMD_USER_WANTSENV{SYSTEMD_USER_WANTS}に置き換えて、機能させました。

ENV{}コンストラクトが必要な理由と、ドキュメントで見つからなかった理由がまだわかりません。

1
Gauthier

本当にサービスをトリガーしたいだけなら、追加します

RUN{program}="/bin/systemctl --user start offnet-uart-log.service"

udevルールに。これには、サービスのタイプがoneshotまたはexecである必要があります。これにより、systemdの呼び出しは、udevで許可されている通常の短い時間枠内に戻ります(を参照)。たとえば、ここでの議論 devイベントで長時間のプロセスを実行する方法は? およびudevと自動マウントについて議論している他のページ。

0
AdminBee