ユーザーレベルのsystemdでdocked.target
を設定したいと思います。アイデアは、いくつかのサービスを実行して外部ディスプレイを構成することです。
私は現在これを私のルールとして持っています:
SUBSYSTEM=="usb", ACTION=="add", ENV{ID_VENDOR}=="17ef", ENV{ID_MODEL}=="100a", SYMLINK+="tp_mini_dock", TAG+="systemd", ENV{SYSTEMD_USER_WANTS}="docked.target"
ルールは問題なく検出されます(ドッキングするとdev-tp_mini_dock.device
が表示されます)。
次に、これを~/.config/systemd/user/docked.target
に入れます(運が悪かったので/etc/systemd/user
も試しました):
[Unit]
Description=Docked to ThinkPad Mini Dock
BindTo=dev-tp_mini_dock.device
しかし、ドッキングしてもこれは開始されません。ただし、ドッキング中に手動でdocked.target
を起動すると、ドッキングを解除すると期待どおりに停止します。
ただし、ENV{SYSTEMD_WANTS}="docked.target"
を使用してファイルを/etc/systemd/system/docked.target
に配置すると、ドッキング時にターゲットが期待どおりに起動します。問題は、ユーザーレベルのインスタンスがシステムレベルのサービス/ターゲットを認識していないことです。
何かご意見は?私はネットの周りで他のいくつかの質問を見ました、そして1つは私のものとほとんど同じです: https://bbs.archlinux.org/viewtopic.php?pid=1600019
SYSTEMD_USER_WANTS
をMANAGER_USER_WANTS
に置き換えてみてください。この名前の変更について100%確信はありませんが、少なくともsystemd-226
では、ソースにSYSTEMD_USER_WANTS
についての言及がなく、MANAGER_USER_WANTS
に置き換えられているようです。少なくとも、同じような場合にはうまくいきました。
ENV{SYSTEMD_USER_WANTS}
がどのように機能するかはまだわかりませんが、 このブログ を読んだ後、特定の問題を解決することができました。
デバイスへの依存関係としてターゲットをインストールできることがわかりました。ユニットファイル~/.config/systemd/user/docked.target
を次のように変更しました。
[Unit]
Description=Docked to ThinkPad Mini Dock
BindsTo=dev-tp_mini_dock.device
After=dev-tp_mini_dock.device
[Install]
WantedBy=dev-tp_mini_dock.device
そして私のudevルールは:
SUBSYSTEM=="usb", ACTION=="add", ENV{ID_VENDOR}=="17ef", ENV{ID_MODEL}=="100a", SYMLINK+="tp_mini_dock", TAG+="systemd"
次に、systemctl --user enable docked.target
で有効にします。
これで、ドッキングすると、udevルールがsystemdデバイスを作成し、それがターゲットを起動します。次に、BindsTo
オプションは、デバイスが消えたとき(プラグが抜かれたとき)にターゲットが停止することを確認します。
ドックがすでに接続されている状態でログインしたときにこれを機能させるには、無意味な魔法をかける必要がありました。default.target
をWantedBy
とAfter
に追加するだけで十分だと想像できます。 ...ブログを書いた後、ブログへのリンクを追加します。
男...その問題は私も病気にした、なんてバグだ!
私の場合、HDMI(モニターホットプラグ)イベントを聞きたかったのですが、この問題を回避する方法を見つけました。このudev
が、この名前またはその名前でサービスを開始したことをどういうわけか知っていて、再度実行することを拒否した場合は、毎回新しいサービスを開始すると信じ込ませましょう。対応するudev
イベントに注目:
UDEV [19214.534185] change /devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card0 (drm)
ACTION=change
DEVLINKS=/dev/dri/by-path/pci-0000:01:00.0-card
DEVNAME=/dev/dri/card0
DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card0
DEVTYPE=drm_minor
HOTPLUG=1
ID_FOR_SEAT=drm-pci-0000_01_00_0
ID_PATH=pci-0000:01:00.0
ID_PATH_TAG=pci-0000_01_00_0
MAJOR=226
MINOR=0
SEQNUM=3364
SUBSYSTEM=drm
USEC_INITIALIZED=3280572
SEQNUM
に注目してください。それは新しいイベントごとに変化しており、まさにそれが私たちが望んでいることです。
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", ENV{SYSTEMD_USER_WANTS}+="monitor-hotplug@$env{SEQNUM}.service", TAG+="systemd"
~/.config/systemd/user/[email protected]
でもチャームのように機能します。うまくいけば、あなたのイベントにもSEQNUM
または同様のものがあります。