ubuntuusers.de

while abfrage und verändernden Variablen

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

ThomasST

Anmeldungsdatum:
10. April 2022

Beiträge: 3

Guten Abend, ich habe habe leider ein kleines aber feines Problem mit meinem Script. Im Grunde läuft es, aber im Grunde auch nicht. Das Problem an der Sache ist die HDD Abfrage bzw. der Inhalt der Schleife. ich möchte, dass das Script im Hintergrund läuft und sobald die USB Platte mit der passenden Kennung eingeschalten wird, soll via rsync ein backup erfolgen. Wenn ich das Script starte sobald die HDD angeschalten ist, dann läuft es auch durch, da er das passende Laufwerk mit der passenden Partition findet. Starte ich zuerst das Script und schalte dann die HDD an, dann bleibt das script bei der HDD abfrage hängen. Wenn das Script nach dem HDD start gestartet wurde, prüft er ob die UUID mit der Partiiton übereinstimmt. In diesem Fall auf /dev/sde1 (UUID b2e5fd9d-ed14-465c-8ced-314e6d6b384f). Starte ich das Script vor dem Start der HDD, dann prüft er die UUID (b2e5fd9d-ed14-465c-8ced-314e6d6b384f) bei /dev/disk/by-uuid/0CD6AAFFD6AAE7E2 und das ist der Knackpunkt. Die Variable /usr/bin/readlink -f /dev/disk/by-uuid/$HDDUUID wird nicht neu geprüft sondern bleibt immer gleich. Ich kann auch nicht sagen, dass es immer /dev/sde ist, da sich ja manchmal die Laufwerksbuchstaben auch verschieben. Deswegen ja die Abfrage via readlink und der Vergleich mit der UUID. Vielleicht hat ja jemand anderes eine Lösung. Via systemd ist leider keine Lösung.

  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
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin:/opt/sbin

#backup harddrive variables
UUID=b2e5fd9d-ed14-465c-8ced-314e6d6b384f
HDDUUID=0CD6AAFFD6AAE7E2
PIDFILE=/opt/var/run/AutoSyncVideo.pid
BACKUPDIR=/media/usb/
TOBACKUP="/mnt/md1/Video /mnt/md1/DvD"
PARTITION=`/usr/bin/readlink -f /dev/disk/by-uuid/$HDDUUID`
SLEEPTIME=30
LOGFILE=/opt/root/rsynclog.log


Background()
{
	[ -f $PIDFILE ] && [ -f /proc/` cat $PIDFILE `/cmdline ] && echo "$0 is already running" && exit 1
    echo $$ >$PIDFILE
    trap "rm -f $PIDFILE ; exit 0" INT TERM EXIT
	echo 'Starte Script' >> $LOGFILE
	while :
	do 
	echo 'Starte schleife' >> $LOGFILE
	echo -e "/sbin/blkid | grep -s $PARTITION | grep -c $UUID" >> $LOGFILE
	echo -e "$PARTITION $UUID" >> $LOGFILE
	if [ `/sbin/blkid | grep -s $PARTITION | grep -c "$UUID"` -eq 1 ]; then
		echo 'Starte rsync' >> $LOGFILE
		
		FLAG='1'
		echo -e "$FLAG" >> $LOGFILE
		if [ $FLAG = 1 ]; then
				
			#check if drive mounted
			if grep -qs $PARTITION /proc/mounts; then
			#its already mounted
				MOUNTED='1'
			echo 'Drive already mounted' >> $LOGFILE
				BACKUPDIR=`grep $PARTITION /proc/mounts | awk '{ print $2 }'`
				echo 'Directory: ' $BACKUPDIR >> $LOGFILE
			else
				#not mounted
				MOUNTED='0'
				echo 'Mounting drive' >> $LOGFILE
				sudo mkdir -p "$BACKUPDIR"
				sudo mount /dev/disk/by-uuid/$UUID "$BACKUPDIR"
				echo 'Mounted: ' $BACKUPDIR >> $LOGFILE
			fi
	
			#perform home backup
				rsync -au --delete $TOBACKUP $BACKUPDIR
		
			#clean up
			if [ $MOUNTED = 0 ]; then
			#unmount and remove dir
			echo 'Unmounting drive' >> $LOGFILE
				sudo umount "$PARTITION"
				sudo rmdir "$BACKUPDIR"
			else
				echo 'Leaving drive mounted' >> $LOGFILE
			fi


				echo 'Backup Complete!' >> $LOGFILE
				exit
		fi
	else 
	echo -e "schlafe $SLEEPTIME Sekunden" >> $LOGFILE
      sleep $SLEEPTIME
	fi
done

}








case $1 in
   start)
      $0 background &
	echo "Starting Autobackup Video..." 
      ;;
   stop)
      kill -9 ` cat $PIDFILE `
	echo "Stopping Autobackup Video ` cat $PIDFILE ` "
	rm -f $PIDFILE
      ;;
   status)
      [ -f $PIDFILE ] && [ -f /proc/` cat $PIDFILE `/cmdline ] && echo "running as ` cat $PIDFILE ` " && exit 0
      echo "not running"
      ;;
   background)
      Background
      ;;
   *)
      echo "use $0 [ start | stop | status ]"
      ;;
esac

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4452

Wohnort: Göttingen

Erstmal willkommen hier im Forum!

Hast Du Dir mal udev angeschaut? Da ist auch ein Beispiel zum Starten eines Backup-Skripts mit in dem Artikel...

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

UDEV ist wie der Doc gesagt hat genau das, was du brauchst und spart dir die Endlosschleife.

Abgesehen davon: Nutze findmnt zum parsen der mounts, $() anstatt backticks für Subshells, und das Mitloggen lässt sich auch vereinfachen:

#!/bin/bash
exec 2> ~/my.error > ~/my.log
date
echo >&2 Fehler

loggt das Datum in my.log und Fehler in my.error. Dann brauchst du nicht jedesmal echo >> log schreiben.

Was das eigentliche Problem angeht: Du müsstest die Abfrage mit readlink machen, nachdem die Platte angeschlossen wurde. Variablen aktualisieren sich nicht automatisch, die gehört also mit in die Dauerschleife.

ThomasST

(Themenstarter)

Anmeldungsdatum:
10. April 2022

Beiträge: 3

Habe es mal via udev getestet. Und das script wird auch gestartet nur leider scheint der readlink nicht so richtig zu funktionieren. via shell und händisch gestartete script bekomme ich das bei der Eingabe von "/usr/bin/readlink -f /dev/disk/by-uuid/0CD6AAFFD6AAE7E2" raus /dev/sde1

und via udev gestartete script nur das /dev/disk/by-uuid/0CD6AAFFD6AAE7E2

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Mit udev brauchst du kein readlink mehr.

udev:

1
…SYMLINK+="backup"  RUN+="/usr/local/bin/mybackup.script" 

/usr/local/bin/mybackup.script:

1
2
3
4
5
PARTITION=$(findmnt /dev/backup -no TARGET) || {
  mount /dev/backup /backup
#entspricht dann:  mount /dev/disk/by-uuid/$12345678-1234-1234-1234-123456789012 /backup
  PARTITION=/backup
}

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11257

Wohnort: München

Über udev sollten keine lange laufenden Skripte gestartet werden und das Mounten von Dateisystem ist Tabu - vgl. man 7 udev:

       RUN{type}
           Add a program to the list of programs to be executed after processing all the rules
           for a specific event, depending on "type":

[...]

           This can only be used for very short-running foreground tasks. Running an event
           process for a long period of time may block all further events for this or a dependent
           device.

           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.

           Note that running programs that access the network or mount/unmount filesystems is not
           allowed inside of udev rules, due to the default sandbox that is enforced on
           systemd-udevd.service.

           Please also note that ":=" and "=" are clearing both, program and builtin commands.

           In order to activate long-running processes from udev rules, provide a service unit,
           and pull it in from a udev device using the SYSTEMD_WANTS device property. See
           systemd.device(5) for details.

Richtig geht das über eine Systemd-Unit.

ThomasST

(Themenstarter)

Anmeldungsdatum:
10. April 2022

Beiträge: 3

Habe es heute früh geändert und das script lief dann durch. Danke für den Tipp mit udev.

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4452

Wohnort: Göttingen

Ok, sehr schön! Falls das Problem damit gelöst ist, markiere das Thema bitte noch als gelöst.

Antworten |