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