将udev环境变量传递给systemd服务执行


5

我正在迁移绑定到块设备的更改操作并运行给定脚本的现有udev规则。

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

在此配置中,udev传递了与硬件设备关联的环境变量,例如 ID_CDROM_MEDIA-0ID_FS_LABEL。我已经更新了udev规则以使用systemd在硬件更改上启动服务。

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的执行环境,还是需要显式传递参数?

Answers:


4

虽然我没有找到将环境从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
 ...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.