Передача переменных среды 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 или мне нужно явно передать параметры?
2 ответа
Хотя я не нашел способа передать среду от 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
...
Чтобы расширить отличный ответ @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
и т. д..