5

Я переношу существующее правило udev, которое связано с действием изменения блочного устройства, и запускает данный скрипт.

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

В этой конфигурации udev передал переменные среды, связанные с аппаратным устройством, такие как ID_CDROM_MEDIA-0 и ID_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

На этом этапе служба запускается при событиях изменения, но переменные среды, передаваемые командой RUN в udev, не передаются в выполнение службы.

Можно ли передать среду от udev в среду выполнения systemd или мне нужно явно передать параметры?

1 ответ1

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
 ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .