Передача переменных среды udev в выполнение службы systemd

Передача переменных среды udev в выполнение службы systemd

Я переношу существующее правило 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

Хотя я не нашел способа передать среду из 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
 ...

решение2

Чтобы продлить великоеотвечатьот @Ben Campbell..

Вот как получить доступ к свойству из базы данных среды udev после того, как устройство активировало правило udev. Например, USB-накопитель был только что подключен, и вы хотите получить его метку.

В скрипте, запускаемом службой systemd, после eval $(udevadm info --query=env --export $1)строки добавьте что-то вроде:
echo $ID_FS_LABEL >> "/tmp/file.txt"

Аналогично можно получить значения для ID_PART_ENTRY_UUIDи ID_VENDORт.д.

Связанный контент