Hallo zusammen,
ich bin relativ neu was shell-scripts angeht und habe hier ein für mich merkwürdiges Problem, bei dem ich nicht durchsteige und gerne mal eure Meinungen hören würde.
Folgendes Szenario:
Ich möchte, dass sobald ein bestimmter USB-Stick angeschlossen wird, ein rsync-script angestoßen wird, welches Inhalte mehrerer Ordner aus verschiedenen Shares eines Servers auf den USB-Stick kopiert.
Meine Lösung besteht zur Zeit aus 3 Teilen.
1- UDEV-Rule (triggert das Mount-Script)
1 | KERNEL=="sd*", ATTRS{serial}=="AABBCCDD", ACTION=="add", SYMLINK+="usbbackup", RUN+="/usr/local/bin/mount-it.sh" |
2- Mount-Script "/usr/local/bin/mount-it.sh" (triggert das Backup-Script)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/usr/bin/bash exec &> /var/log/usbbackup # Init beep -f 523.251 -l 100 -D 100 echo "$(date '+%Y-%m-%d %H:%M:%S') - USB-Stick wurde angeschlossen." >> /var/log/usbbackup # Mounten des USB-Sticks echo "USB Stick mounten..." >> /var/log/usbbackup sudo umount -f /mnt/usbbackup sudo mount -t exfat -o rw,umask=0000,uid=$(id -u) /dev/usbbackup /mnt/usbbackup if grep -qs '/mnt/usbbackup' /proc/mounts; then echo "Dateisystem ist gemounted. Führe fsck aus." >> /var/log/usbbackup # Führe fsck mit der Option "-a" aus, um das Dateisystem automatisch zu reparieren sudo fsck -a /mnt/usbbackup fi # Start des Backup Scripts vom USB-Stick /mnt/usbbackup/start-backup.sh >> /var/log/usbbackup sudo umount -f /mnt/usbbackup echo "Ende Mountscript" >> /var/log/usbbackup beep -f 1000 -l 100 -D 500 -r 3 # Ende |
3- Backup-Script "/mnt/usbbackup/start-backup.sh"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #! exec &> /var/log/usbbackup echo "### Start Backupscript" # Variablen definieren USER='username' PASS='password' SERVER='10.X.X.X' FOLDERS=(Share1/Ordner1 Share2/Ordner1 Share2/Ordner2 Share3/Ordner1 Share4/Ordner1) SOURCE='/mnt/backup_source' DEST='/mnt/usbbackup' # INIT beep -f 1000 -l 100 -D 100 -r 2 # Schleife for FOLDER in "${FOLDERS[@]}" do # Mount SMB sudo mount -t cifs -o username=$USER,password=$PASS,vers=3.0 //$SERVER/$FOLDER $SOURCE sleep 5 #Start Kopie sudo rsync -av --delete $SOURCE/ $DEST/$FOLDER if [ $? -eq 0 ] then /usr/local/bin/beep_up.sh else /usr/local/bin/beep_down.sh fi #Unmount SMB sudo umount -f $SOURCE done echo "### Ende Backupscript" >> /var/log/usbbackup # Ende |
Die /etc/sudoers habe ich folgendermaßen bearbeitet:
1 2 3 4 | ALL ALL=(ALL) NOPASSWD: /usr/bin/mount ALL ALL=(ALL) NOPASSWD: /usr/bin/umount ALL ALL=(ALL) NOPASSWD: /usr/bin/rsync ALL ALL=(ALL) NOPASSWD: /usr/bin/fsck |
Nun zu meinem Verständnisproblem:
Wenn ich die Variablen von Hand in der Shell definiere und anschließend die Schleife in die Shell kopiere, wird alles einwandfrei ausgeführt. Wenn ich das Backup-Script von Hand anstoße, wird auch alles einwandfrei ausgeführt.
Wenn ich aber die ganze Kette durch die UDEV-Rule anstoßen lasse (also den USB Stick anschließe), wird zwar der Stick korrekt gemountet, aber der mount Befehl innerhalb der Schleife im Backup-Script verhält sich plötzlich anders. Hier ist der Auszug aus meinem log
1 2 3 | ### Start Backupscript mount error(115): Operation now in progress Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg) |
Im syslog erhalte ich den selben Hinweis (Error 115).
Ich konnte zu diesem Fehler bisher nur herausfinden, dass der Socket nicht geöffnet werden konnte, evtl. weil bereits eine Operation läuft. Ich komme hier nicht mehr weiter, kann mir bitte jemand über die Straße helfen?
Wie gehe ich in solch einem Fall am besten vor, was ist die wahrscheinlichste Fehlerquelle? Habe ich hier ein Problem durch die Verkettung von UDEV → mount-script → backup-script? Wird das Backup-Script dadurch, dass es durch das mount-script getriggert wird in der Umgebung eines anderen Users ausgeführt?
Besten Dank im Voraus, Chris