web-dev-qa-db-ja.com

udevによって実行されるシェルスクリプトで実行されないコマンド

外部ドライブがUSB経由で接続されている場合は常に、udevを使用して、ハードドライブを外部ドライブにバックアップするシェルスクリプトを実行するのに問題があります。 rdiff-backupの実際の呼び出し以外はすべて機能します。 udevはハードドライブを検出し、スクリプトを適切に呼び出します。スクリプトは実行され、デスクトップ通知を適切に表示しますが、シェルスクリプトによってrdiff-backupが実行されることはなく、スクリプトはドライブをバックアップせずにすぐに終了します。スクリプトに適切な権限が付与されるように、sudoersファイルを既に編集しています。

イカはこのアクションを比較的簡単に実行できることを知っていますが、一般的な方法を習得するために、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
Nick Hudspeth

行を削除しますSudo su。それは決して戻らない新しいルートシェルを開始し、それがその後のコマンドが実行されない理由です。

それに加えて、自分に_Sudo suパスワードなしでは深刻なセキュリティリスクになるため、現実の環境では実行しないでください。

2
sмurf

予想される問題はほとんどありません。

  1. 一致条件である必要がありますassignmentATTR{idProduct}="0621"である必要がありますequalityATTR{idProduct}=="0621"

  2. このルールは、パーティションをマウントする前に実行され、パーティションテーブルを読み取る前であってもかまいません。

    挿入したばかりのフラッシュディスクの例:

    $ 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"
    
  3. 以前のmodでも、マウントする前にルールが実行される可能性があるため、遅延が必要です。もう1つ、UDEVは長いタスクを実行できないため、rdiff-backupがすぐに終了しなかった場合、UDEVによって強制終了されます。 man udevをご覧ください

    これらを解決するには、新しいプロセスを生成し、それを否認します。この答えのように参照してください: udevadm triggerを使用する場合、udevルールが実行されるのはなぜですか?

0
user.dz