LINUX.ORG.RU

Fedora 20. Не работает правило udev при подключении/отключении внешнего питания.

 ,


0

1

В /etc/udev/rules.d/91-power.rules написал:

SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/bin/echo 'off' >> /home/data/test"
SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/bin/echo 'on' >> /home/data/test"

Сделал udevadm control --reload

Вытыкаю/втыкаю кабель.

udevadm monitor показывает:

KERNEL[2672.773310] change   /devices/platform/ACPI0003:00/power_supply/AC0 (power_supply)
UDEV  [2672.803313] change   /devices/platform/ACPI0003:00/power_supply/AC0 (power_supply)
KERNEL[2673.347460] change   /devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
UDEV  [2673.348692] change   /devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
KERNEL[2673.352306] change   /devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
UDEV  [2673.353478] change   /devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
KERNEL[2679.249270] change   /devices/platform/ACPI0003:00/power_supply/AC0 (power_supply)
UDEV  [2679.280336] change   /devices/platform/ACPI0003:00/power_supply/AC0 (power_supply)
KERNEL[2679.818443] change   /devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
UDEV  [2679.819827] change   /devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
KERNEL[2679.823319] change   /devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
UDEV  [2679.824619] change   /devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 (power_supply)

В файл /home/data/test ничего не пишется. Правило не срабатывает. Почему? :(

★★★★★

Из man udev:

RUN{type}
...
Starting daemons or other long-running processes is not appropriate for udev;
the forked processes, detached or not, will be unconditionally killed after the event handling has finished.
Скрипт не успевает запуститься, надо сделать запуск через systemd сервис:
$ cat /etc/udev/rules.d/91-power.rules
SUBSYSTEM=="power_supply", TAG+="systemd", ENV{SYSTEMD_WANTS}="mypower@$attr{online}.service"
$ cat /etc/systemd/system/mypower.service
[Unit]
Description=Power supply handling task

[Service]
ExecStart=/usr/local/bin/power.sh %I
$ cat /usr/local/bin/power.sh
case $1 in
  0)
    echo 'off' >> /home/data/test
    ;;
  1)
    echo 'on' >> /home/data/test
    ;;
  *)
    echo "Invalid argument"
    ;;
esac
Насчет финта с mypower@$attr{online} не уверен.

Не забудь сделать скрипт power.sh исполняемым.

mtk
()
Ответ на: комментарий от mtk

спасибо, интересная информация.
Но что-то почему-то всё равно не работает.

Bad_ptr ★★★★★
() автор топика
Ответ на: комментарий от mtk

Вернее, даже работает. Но почему-то срабатывает только один раз, при загрузке. Потом на втыкание/вытыкание кабеля не реагирует.

Bad_ptr ★★★★★
() автор топика
Ответ на: комментарий от Bad_ptr

Есть подозрение, что при последующих событиях udev systemd считает сервис уже активным, и не запускает снова. Посмотри systemctl status mypower@on, статус должен быть active (exited).

Также, есть идея сделать при ATTR{online}=="0" запуск сервиса, а при ATTR{online}=="1" - останов. Надо запускать systemctl вручную:

$ cat /etc/udev/rules.d/91-power.rules
SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/usr/bin/systemctl start --no-block mypower.service"
SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/usr/bin/systemctl stop --no-block mypower.service"
$ cat /etc/systemd/system/mypower.service
[Unit]
Description=Power supply handling task

[Service]
ExecStart=/usr/local/bin/power.sh on
ExecStart=/usr/local/bin/power.sh off
Опция no-block должна обеспечить неубивание скрипта udev-ом после завершения обработки события.

mtk
()
Ответ на: комментарий от mtk

при последующих событиях udev systemd считает сервис уже активным, и не запускает снова

Ну да, я тоже так подумал, и похоже что так и есть, спасибо.

Вот тут ещё через BindsTo говорят можно сделать
http://unix.stackexchange.com/questions/63232/what-is-the-correct-way-to-writ...

Надо попробовать.

Bad_ptr ★★★★★
() автор топика
Ответ на: комментарий от Bad_ptr

Таки так:

С BindsTo не получилось, там видимо устройство, которое просто за питание отвечает и не меняет свой статус при подключении/отключении шнура.

Через ExecStart/ExecStop получилось, но только после того как в секцию [Service] добавил
Type=oneshot
RemainAfterExit=yes
KillMode=none

Bad_ptr ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.