LINUX.ORG.RU

Запустить бекап при монтировании флешки в KDE

 , , , ,


0

2

Есть флешка, я её втыкаю, в плазмоиде «подключаемые устройства» жму «показать в диспетчере файлов» и в этот момент она автоматически кдешной магией монтируется в /run/media/legolegs/имятома и в этот момент я хочу автоматически запустить скрипт бекапа.

Вопрос: как это сделать? Через udev так нельзя (это запасной вариант, он тогда сам должен будет монтировать, помимо kde)

Может быть можно отследить момент монтирования через udev, udiskd или systemd? грепать mtab в цикле не предлагать.

★★★★★

Может быть можно отследить момент монтирования через

udev

Нельзя.

udiskd

Можно следить за сигналами DBus API. Писать пример влом.

systemd

Только если заранее известно имя тома (а если точнее, то путь до точки монтирования). Тогда можно написать юнит и добавить его в зависимости к run-media-USERNAME-VOLUMENAME.mount:

[Unit]
BindsTo=run-media-USERNAME-VOLUMENAME.mount
After=run-media-USERNAME-VOLUMENAME.mount

[Service]
Type=oneshot
ExecStart=/path/to/script

[Install]
WantedBy=run-media-USERNAME-VOLUMENAME.mount
intelfx ★★★★★ ()
Ответ на: комментарий от legolegs

А есть какой-то стандартный способ мониторить эти сообщения? Положить куда-то файл в conf.d как у udev?

Топорно — busctl --json=pretty --system monitor org.freedesktop.UDisks2, дальше парсить stdout чем хочешь (хоть шеллом с jq).

Правильно — написать программу на любом языке с биндингами к libdbus/sd-bus.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Только если заранее известно имя тома

Да, известно, я какие попало флешки не бекаплю.

BindsTo= WantedBy=

Во, вот про эти вещи я не вкурил сам! Писал Requires=run-media-USERNAME-VOLUMENAME.mount, оно ругалось что нет такого юнита и не работало.

Спасибо, это то, что нужно.

А делать демона, который будет смотреть в dbus - это слишком сложно и хрупко.

legolegs ★★★★★ ()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Во, вот про эти вещи я не вкурил сам!

Про WantedBy= написано в каждом первом туториале про systemd. Оно само не начнёт работать, нужно сделать systemctl enable UNIT.

А BindsTo= так-то вообще необязателен, это на тот случай, если ты флешку выдернешь посреди бэкапа — тогда systemd прибьёт процесс.

Спасибо, это то, что нужно.

Имей в виду, что если у тебя в VOLUMENAME есть что-то кроме [0-9a-zA-Z], то эти символы нужно заэкранировать. Проще всего подсмотреть реальный путь до точки монтирования и написать systemd-escape --path /actual/path/to/mountpoint.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от legolegs

Писал Requires=run-media-USERNAME-VOLUMENAME.mount, оно ругалось что нет такого юнита и не работало.

Ну вообще оно так и будет писать. Но это нормально: зависимости от неизвестных юнитов игнорируются, а когда точка монтирования на самом деле появится, systemd должен всё пересчитать.

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

а когда точка монтирования на самом деле появится, systemd должен всё пересчитать.

Хотя погоди. Возможно, я тебе дичь насоветовал. Сейчас проверю. Не, всё работает.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от legolegs

Ну ясен хер, что без WantedBy= не работало — если написать, что X requires Y, то это совершенно не означает, что при появлении Y нужно сделать X. Как я уже написал в том треде, на который ты сослался, systemd не событийный.

Я говорю о том, что между Requires= и BindsTo= разницы практически нет. Эту часть можно вообще убрать, она там для надёжности. Ключевые — это зависимость в обратную сторону (WantedBy=) и указание порядка (After=).

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Благодарю, я начинаю понимать. В системд есть своя логика, но если трогаешь его лишь эпизодически, то бывает трудно сделать что-то, что раньше не мог делать на инитскриптах.

legolegs ★★★★★ ()