web-dev-qa-db-ja.com

udev環境変数をsystemdサービスの実行に渡す

ブロックデバイスの変更アクションにバインドされ、特定のスクリプトを実行する既存のudevルールを移行しています。

SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", RUN+="/usr/local/bin/script"

この構成では、udevはID_CDROM_MEDIA-0ID_FS_LABELなどのハードウェアデバイスに関連付けられた環境変数を渡しました。それ以来、ハードウェアの変更時にsystemdを使用してサービスを開始するようにudevルールを更新しました。

SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", TAG+="systemd", ENV{SYSTEMD_WANTS}=="drive-change.service"

Systemdサービスファイル:

[Unit]
Description=changes to dvd drive

[Service]
Type=oneshot
ExecStart=/usr/local/bin/script

[Install]
WantedBy=multi-user.target

この時点で、サービスは変更イベントで実行されますが、udevのRUNコマンドによって渡された環境変数はサービスの実行に渡されません。

Udevからsystemdの実行環境に環境を渡すことは可能ですか、それともパラメーターを明示的に渡す必要がありますか?

5
Ben Campbell

Udevからsystemdに環境を渡す方法は見つかりませんでしたが、udevデータベースに環境プロパティを照会することは可能です。 udevadm infoコマンド 両方の--queryおよび--export環境プロパティのみをクエリし、評価可能な形式で出力できるパラメータ。

Systemdインスタンス変数とudevadmコマンドを組み合わせて、環境変数を初期化しました。

SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", TAG+="systemd", ENV{SYSTEMD_WANTS}=="drive-change@%E{DEVNAME}.service"

このudevルールは、次のサービスファイルを実行し、DEVNAME変数をインスタンス変数としてサービスに渡します。

[Unit]
Description=changes to dvd drive

[Service]
Type=oneshot
ExecStart=/usr/local/bin/script %I

[Install]
WantedBy=multi-user.target

このインスタンス変数を使用してudev要素の環境プロパティを評価し、問題を解決しました。

#!/bin/sh

# Systemd passes the DEVNAME as the first parameter to the script
eval $(udevadm info --query=env --export $1)

 # The rest of the script that depends on the udev environment
 ...
5
Ben Campbell