Команды, не выполняющиеся в сценарии оболочки, запускаемые udev
У меня проблемы с использованием udev для запуска сценария оболочки, который выполняет резервное копирование моих жестких дисков на внешний диск всякий раз, когда внешний диск подключен через USB. Все работает, кроме самого вызова rdiff-backup. Udev обнаруживает жесткий диск и правильно вызывает скрипт. Сценарий запускается и правильно отображает уведомления на рабочем столе, но rdiff-backup никогда не запускается сценарием оболочки, и сценарий запускается немедленно, без резервного копирования дисков. Я уже отредактировал файл sudoers, чтобы у скрипта были соответствующие разрешения.
Я знаю, что Cuttlefish позволил бы мне выполнить это действие сравнительно легко, но в интересах изучения общего метода, я бы предпочел научиться использовать инструменты, уже встроенные в Linux, чтобы выполнить это самостоятельно. Любая помощь будет принята с благодарностью.
Мои правила udev определяются как:
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1f75", ATTR{idProduct}="0621", RUN+="/home/nam/.scripts/backup_root_and_home_folders_to_external_drive.sh"
и мой сценарий оболочки выглядит следующим образом:
#!/bin/bash
#sudo su
export DISPLAY=:0
export XAUTHORITY=/home/nam/.Xauthority
logger "Backing up root and home directories to external drive..."
###BACKUP ROOT DIRECTORY
#Issue system notification for backup begin
sv=$(date "+%T")
msgvar="Backing up directory / to external drive started at "
notif=${msgvar}${sv}
sudo -u nam DISPLAY=":0.0" notify-send -t 1000 "$notif"
#notify-send -t 1000 "$notif"
logger "$notif"
#sleep 5
#Start backup of / directory
st=$SECONDS
#sudo rdiff-backup -v6 --force --exclude /sys --exclude /run --exclude /media --exclude /proc --exclude /home / /media/nam/BACKUP1/root
sudo su
/usr/bin/rdiff-backup -v6 --exclude /sys --exclude /run --exclude /media --exclude /proc --exclude /home / /media/nam/BACKUP1/root
#logger "$ok"
#Issue system notification for backup end
sv=$(date "+%T")
stt=$SECONDS
et=$(($stt - $st))
#notify-send -t 1000 "Backup of directory / completed at $sv.
#Process took $et seconds."
sudo -u nam DISPLAY=":0.0" notify-send -t 1000 "Backup of directory / completed at $sv.
Process took $et seconds."
###BACKUP HOME DIRECTORY
#Issue system notification for backup begin
sv=$(date "+%T")
msgvar="Backing up directory /home to external drive started at "
notif=${msgvar}${sv}
#notify-send -t 1000 "$notif"
sudo -u nam DISPLAY=":0.0" notify-send -t 1000 "$notif"
#Start backup of /home directory
#sudo rdiff-backup -v6 --force /home/ /media/nam/BACKUP1/home/
sudo su
sudo /usr/bin/rdiff-backup -v6 /home/ /media/nam/BACKUP1/home/
#Issue system notification for backup end
sv=$(date "+%T")
stt=$SECONDS
et=$(($stt - $st))
#notify-send -t 1000 "Backup of directory /home completed at $sv.
#Process took $et seconds."
sudo -u nam DISPLAY=":0.0" notify-send -t 1000 "Backup of directory /home completed at $sv.
Process took $et seconds."
2 ответа
Удалить строку sudo su
, Он запускает новую корневую оболочку, которая никогда не возвращается, и поэтому любая команда после этого не выполняется.
Кроме того, предоставив себе разрешение на sudo su
Без пароля это серьезная угроза безопасности, которую нельзя делать в реальных условиях.
Я мог заметить несколько ожидаемых проблем:
Должно быть условие соответствия, проверьте это назначение
ATTR{idProduct}="0621"
это должно быть равенствоATTR{idProduct}=="0621"
,Это правило будет работать до монтирования разделов и может быть даже до чтения таблицы разделов.
Пример с подключенным флэш-диском:
$ udevadm monitor -u monitor will print the received events for: UDEV - the event which udev sends out after rule processing UDEV [8850.369941] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1 (usb) UDEV [8850.374279] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0 (usb) UDEV [8850.378578] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4 (scsi) UDEV [8850.380505] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/scsi_host/host4 (scsi_host) UDEV [8851.373706] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0 (scsi) UDEV [8851.373727] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0 (scsi) UDEV [8851.377944] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/scsi_disk/4:0:0:0 (scsi_disk) UDEV [8851.380841] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0 (bsg) UDEV [8851.382182] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/scsi_generic/sg2 (scsi_generic) UDEV [8851.382563] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/scsi_device/4:0:0:0 (scsi_device) UDEV [8851.399453] add /devices/virtual/bdi/8:16 (bdi) UDEV [8852.542377] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/block/sdb (block) UDEV [8853.591178] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb2 (block) UDEV [8853.591724] add /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb1 (block)
Это правило предназначено для узла устройства USB
/devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0
где удобнее ориентироваться на пример узлов раздела/devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb1
, добавлятьKERNEL
имя узла и использованиеATTRS
для правила матча.ACTION=="add", KERNEL="sdb?", SUBSYSTEM=="usb", ATTRS{idVendor}=="1f75", ATTRS{idProduct}=="0621", RUN+="/home/nam/.scripts/backup_root_and_home_folders_to_external_drive.sh"
Даже с предыдущим модом правила могут запускаться перед монтированием, так что вам нужна задержка. Другое дело, UDEV не может выполнять длинные задачи, поэтому если
rdiff-backup
не закончил в ближайшее время он будет убит UDEV. Увидетьman udev
Чтобы решить их, создайте новый процесс, а затем откажитесь от него. Смотрите как в этом ответе: Почему мои правила udev выполняются, если я использую
udevadm trigger
, но НЕ во время загрузки?