Benutzer-Skript Status abrufen: on, off, state, fileState

Status
Für weitere Antworten geschlossen.

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Moin zusammen, Moin @Fusion ,

ich habe mal eine Frage, gibt es eine Möglichkeit den aktuellen Statis eines .sh Skripts abzurufen und das anhand von evtl. geschaffenen .sh Skripten die durch das System selbst angelegt werden?

Vielleicht macht es Sinn einmal zu zeigen was ich genau möchte:
https://www.npmjs.com/package/homebridge-script2

Ich wÜrde gern ein Script über das oben verlinkte Plugin in meine IOS Umgebung (homebridge) einbinden.

Erstellt DSM diese Schatten Sh Skripte beim ausführen eines Benutzer Skripts und wenn ja wo liegen die?
Oder müsste man da eigene on, off, filestate skripe erstellen die den Status irgendwie Übergeben?!?

Rich (BBCode):
"accessories": [
    {
              "accessory": "Script2",
              "name": "Benutzer Skript USB Copy",
              "on": "/volumen1/test/on.sh 1",
              "off": "/volumen1/test/off.sh 1",            -> kill Befehl??? Oder wie? Oder erstellt DSM so eine Datei?
              "state": "/volumen1/test/state.sh 1",    -> ?!?
              "fileState": "/volumen1/test/script1.flag",  -> ?!?
              "on_value" : "true"
    }
]

Bin für jede Idee oder Tipp sehr dankbar ;)

Viele Grüße
Seger
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Hey meine Lieben,

seid ihr nich alle zwischen den Jahren gefangen, würde mich sehr über einige Hilfe freuen.

Viele Grüße
Seger
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Im on Script schreibst du rein, was passieren soll wenn on gewählt wurde.
Bei Off halt was passiert wenn es Off geht. Das hat nichts unbedingt mit kill zu tun, da ein Script sich ja auch selbst beenden kann/soll.

Wenn du filestate nutzt wird geschaut ob die Datei existiert und somit zwischen on/Off unterschieden.

Evtl muss man bei on die Datei per touch erstellen und bei Off per rm diese löschen.

Probier einfach mal aus ob du on/Off schalten kannst. Wenn nicht leitest du den exit oder so in die State.
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Erstmal herzlichen Dank fürs melden, aber du musstest mich viel mehr an die Hand nehmen.

„On“ hab ich verstanden, da packe ich einfach mein bestehendes Skript rein, aber wo bzw. wie kann ich jetzt das definierte laufende Skript beenden? Dazu muss das Skript ja eine eindeutige ID haben. Woher bekomme ich die ID und ist die immer gleich und wie müsste dann der OFF Befehl aussehen der das laufende Skript beendet? Darüberhinaus gibt es in DSM eine Variable die mir den Statestatus der jeweiligen ID anzeigt oder wie musste der Befehl aussehen der den Status prüft?
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Vielleicht postest du mal das Script welches du nutzen willst, denn viele Scripte beenden sich selbst.

On kann ja auch nur ein Befehl sein welcher ein Gerät einschaltet. Und off dann ein Befehl welches ein Gerät ausschaltet.
Da muss man dann keine pid Abfragen um das Script zu beenden.
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Das Skript soll von mir per Klick (ios) gestartet werden, welches dann ja das ON wäre.

Anschließend benötige ich noch ein State Skript welches den Status anscheinend wieder gibt und ein Skript welches genau das Skript beendet OFF ...

Name das Skripts: USB_KRABBI_21.sh

Rich (BBCode):
#!/bin/bash
echo '3-2' | tee /sys/bus/usb/drivers/usb/bind
sleep 30

AUSWAHLDATUM="2018-11-17"

QUELLE1="/volume1/DiskStation/- Konzerte"
QUELLE2="/volume1/DiskStation/- Filme"
QUELLE3="/volume1/DiskStation/- Kinderfilme"
QUELLE4="/volume1/DiskStation/- Serien"

ZIEL1="/volumeUSB21/usbshare/- Konzerte"
ZIEL2="/volumeUSB21/usbshare/- Filme"
ZIEL3="/volumeUSB21/usbshare/- Kinderfilme"
ZIEL4="/volumeUSB21/usbshare/- Serien"

LOGPFADFINAL="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Log Final.txt"
LOGPFADTEMP="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Temp.txt"
LOGFEHLERPFAD="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Fehler.txt"

timestamp() {
  date +"%d.%m.%Y - %T"
}

before=$(date)

cd "$QUELLE1" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL1" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

cd "$QUELLE2" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL2" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

cd "$QUELLE3" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL3" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

cd "$QUELLE4" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL4" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

awk 'BEGIN{c=0; do{printf "-"; c++}while(c<27); printf "\n"}' >> $LOGPFADTEMP
echo -e "Diese Daten wurden kopiert:" >> $LOGPFADTEMP

gesamtspeicherplatzderfestplatte() {
  df -h /volumeUSB21/usbshare | awk '/^\/volumeUSB21/usbshare { print $2 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

belegterspeicherplatz() {
  df -h /volumeUSB21/usbshare | awk '/^\/volumeUSB21/usbshare { print $3 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

freierspeicherplatz() {
  df -h /volumeUSB21/usbshare | awk '/^\/volumeUSB21/usbshare { print $4 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}

belegterspeicherplatzinprozent() {
  df -h /volumeUSB21/usbshare | awk '/^\/volumeUSB21/usbshare { print $5 }' | tail --lines +2
}

after=$(date)
timeDiff=$(date -u -d @$(($(date -d "$after" '+%s') - $(date -d "$before" '+%s'))) '+%M:%S')

echo -e """\n""Freier Speicherplatz:"" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFADTEMP
echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFADTEMP
echo -e "\nScript-Laufzeit:" $timeDiff "Minuten/Sekunden" >> $LOGPFADTEMP

echo -e "\nStartzeitpunkt: $(timestamp)\n" >> $LOGPFADTEMP

tac "$LOGPFADTEMP" | sed 's/^.*-> /-> /' > "$LOGPFADFINAL"

sleep 30
echo '3-2' | tee /sys/bus/usb/drivers/usb/unbind

exit 0

Darüber Hinaus habe ich noch weitere Skripte wie z.B.:

Name das Skripts: USB_KRABBI_1_22.sh

Rich (BBCode):
#!/bin/bash
echo '3-2' | tee /sys/bus/usb/drivers/usb/bind
sleep 30

AUSWAHLDATUM="2018-11-17"

QUELLE1="/volume1/DiskStation/- Konzerte"
QUELLE2="/volume1/DiskStation/- Filme"
QUELLE3="/volume1/DiskStation/- Kinderfilme"
QUELLE4="/volume1/DiskStation/- Serien"

ZIEL1="/volumeUSB22/usbshare/- Konzerte"
ZIEL2="/volumeUSB22/usbshare/- Filme"
ZIEL3="/volumeUSB22/usbshare/- Kinderfilme"
ZIEL4="/volumeUSB22/usbshare/- Serien"

LOGPFADFINAL="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Log Final.txt"
LOGPFADTEMP="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Temp.txt"
LOGFEHLERPFAD="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Fehler.txt"

timestamp() {
  date +"%d.%m.%Y - %T"
}

before=$(date)

cd "$QUELLE1" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL1" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

cd "$QUELLE2" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL2" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

cd "$QUELLE3" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL3" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

cd "$QUELLE4" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL4" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

gesamtspeicherplatzderfestplatte() {
  df -h /volumeUSB22/usbshare | awk '/^\/volumeUSB22/usbshare { print $2 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

belegterspeicherplatz() {
  df -h /volumeUSB22/usbshare | awk '/^\/volumeUSB22/usbshare { print $3 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

freierspeicherplatz() {
  df -h /volumeUSB22/usbshare | awk '/^\/volumeUSB22/usbshare { print $4 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}

belegterspeicherplatzinprozent() {
  df -h /volumeUSB22/usbshare | awk '/^\/volumeUSB22/usbshare { print $5 }' | tail --lines +2
}

after=$(date)
timeDiff=$(date -u -d @$(($(date -d "$after" '+%s') - $(date -d "$before" '+%s'))) '+%M:%S')

echo -e """\n""Freier Speicherplatz:"" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFADTEMP
echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFADTEMP
echo -e "\nScript-Laufzeit:" $timeDiff "Minuten/Sekunden" >> $LOGPFADTEMP

echo -e "\nStartzeitpunkt: $(timestamp)\n" >> $LOGPFADTEMP

tac "$LOGPFADTEMP" | sed 's/^.*-> /-> /' > "$LOGPFADFINAL"

sleep 30
echo '3-2' | tee /sys/bus/usb/drivers/usb/unbind

exit 0

Kannst du das was mit anfangen und mir weiterhelfen was ich genau machen müsste???

DANKE!!!
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Das sind doch bis auf USB21/USB22 die selben Scripte oder?
Theoretisch könnte man es als Schleife machen oder den Pfad 21/22 automatisch erkennen lassen, sodass nur eins nötig wäre.

Theoretisch würde ich es erstmal so probieren:
Angenommen der Pfad ist so:

"fileState": "/volumen1/test/script1.flag"

die state Zeile würde ich rausnehmen


Dann setzt du im ON Script eine Zeile nach #!/bin/bash ein touch datei
Rich (BBCode):
#!/bin/bash 
touch "/volumen1/test/script1.flag"
Und direkt danach den Rest vom Script.


Das OFF Script sieht wie folgt aus:
Rich (BBCode):
#!/bin/bash 
rm "/volumen1/test/script1.flag"
exit 0
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Hey :),

Thema 1:

ja du hast recht, das sind 2 Skripte weil ich ja am Anfang den USB Port 1 einbinde und am ende wieder ausbinde.
Keine Ahnung wie ich das in eine Abfrage oder Schleife packe, aber das wäre genial, dann brauche ich die nicht immer super zeitversetzt starten, weil ich auch manchmal nicht weiß welche der beiden Platten am Port 1 hängt. Was natürlich sichergestellt sein muss, das die Schleife nicht die USB Platte auswirft während noch kopiert wird. Wenn wir schon bei dem Thema sind: Ich trenne die Platte auch immer sehr "hart" mit dem Befehl :
Rich (BBCode):
echo '3-2' | tee /sys/bus/usb/drivers/usb/unbind
zumindest meckert DSM immer das ich es nicht ordnungsgemäß ausgeworfen habe, gibt es hierfür vielleicht auch noch eine andere Variante?


Thema 2:

Rich (BBCode):
"accessories": [{
		"accessory": "Script2",
		"name": "USB",
		"on": "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI_21.sh",
		"off": "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI_21_OFF.sh",
		"fileState": "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI_21.flag",
		"on_value": "true"
	}]

Ist wie von Dir beschrieben eingerichtet. Das "Gerät" "USB" wird mir auch als Schalter in IOS angezeigt, aber wenn ich den auf ON stelle führt er das Skript nicht aus!?! Im Docker-Terminal kommt kein Fehler, der Schalter wird ON gesetzt aber das Skript startet nicht und dementsprechend wird auch keine .flag Datei erstellt.

Gehe ich über den Aufgabenplaner (DSM) und führe ich das Skript aus, wird auch eine .flag Datei erstellt. Die Skripte haben alle root Rechte.
Kann ich das vielleicht gar nicht ohne den Aufgabenplaner ausführen?

/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI_21.sh:

Rich (BBCode):
#!/bin/bash
touch "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI_21.flag"

echo '3-2' | tee /sys/bus/usb/drivers/usb/bind
sleep 30

AUSWAHLDATUM="2018-11-17"

QUELLE1="/volume1/DiskStation/- Konzerte"
QUELLE2="/volume1/DiskStation/- Filme"
QUELLE3="/volume1/DiskStation/- Kinderfilme"
QUELLE4="/volume1/DiskStation/- Serien"

ZIEL1="/volumeUSB21/usbshare/- Konzerte"
ZIEL2="/volumeUSB21/usbshare/- Filme"
ZIEL3="/volumeUSB21/usbshare/- Kinderfilme"
ZIEL4="/volumeUSB21/usbshare/- Serien"

LOGPFADFINAL="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Log Final.txt"
LOGPFADTEMP="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Temp.txt"
LOGFEHLERPFAD="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Fehler.txt"

timestamp() {
  date +"%d.%m.%Y - %T"
}

before=$(date)

cd "$QUELLE1" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL1" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

cd "$QUELLE2" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL2" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

cd "$QUELLE3" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL3" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

cd "$QUELLE4" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL4" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

awk 'BEGIN{c=0; do{printf "-"; c++}while(c<27); printf "\n"}' >> $LOGPFADTEMP
echo -e "Diese Daten wurden kopiert:" >> $LOGPFADTEMP

gesamtspeicherplatzderfestplatte() {
  df -h /volumeUSB21/usbshare | awk '/^\/volumeUSB21/usbshare { print $2 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

belegterspeicherplatz() {
  df -h /volumeUSB21/usbshare | awk '/^\/volumeUSB21/usbshare { print $3 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

freierspeicherplatz() {
  df -h /volumeUSB21/usbshare | awk '/^\/volumeUSB21/usbshare { print $4 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}

belegterspeicherplatzinprozent() {
  df -h /volumeUSB21/usbshare | awk '/^\/volumeUSB21/usbshare { print $5 }' | tail --lines +2
}

after=$(date)
timeDiff=$(date -u -d @$(($(date -d "$after" '+%s') - $(date -d "$before" '+%s'))) '+%M:%S')

echo -e """\n""Freier Speicherplatz:"" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFADTEMP
echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFADTEMP
echo -e "\nScript-Laufzeit:" $timeDiff "Minuten/Sekunden" >> $LOGPFADTEMP

echo -e "\nStartzeitpunkt: $(timestamp)\n" >> $LOGPFADTEMP

tac "$LOGPFADTEMP" | sed 's/^.*-> /-> /' > "$LOGPFADFINAL"

sleep 30
echo '3-2' | tee /sys/bus/usb/drivers/usb/unbind

exit 0

/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI_21_OFF.sh:

Rich (BBCode):
#!/bin/bash 
rm "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI_21.flag"
exit 0

HERZLICHEN DANK, das du dir die Mühe machst und mir hilfst!

p.s. wenn es nachher nur noch ein Skript ist wäre es schon mal alles leichter (dachte erst an 8 Ziele und 8 Quellen, aber da schieße ich glaube ich alles mit kaputt) ;-), DANKE!

Viele Grüße
Seger
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Hast du dem Script mal Rechte gegeben chmod 755 oder chmod +x ?
Mal probieren und dann schauen ob es auch so gestartet werden kann.


Befinden sich die Quellordner immer unter /volume1?
Hast du manchmal auch beide Platten gleichzeitig verbunden?

Theoretisch ist es egal an welchem Port diese hängt, man kann alles auswerten und Quasi einfach ein Script nutzen für den Vorgang.
Eine Schleife könnte man z.B. bauen und alle Quellen wie folgt angeben: sources="Konzerte|Filme|Kinderfilme|Serien"
Die Schleife wirft die Platte auch nicht aus, solange kopiert wird.

Soll die Platte nach der Sicherung automatisch getrennt werden? Gibt da 2-3 Befehle, damit DSM dann nicht meckert.


Mit UB2 wird auch vieles nochmal erweitert.
Und es ist ja auch schon möglich, so ein Backup durchzuführen, wenn die Platte angeschlossen wird.
Alles Vollautomatisiert.
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Moin und frohes Neues erstmal!

Ja, die Quellordner sind immer auf Volumen1 nur die Zielordner sind eben entweder VolumenUSB21 oder eben VolumenUSB22, Die Zielpfade sind auch immer diese, da die beiden Festplatten fest in die USB Guidmap geschrieben sind. Ja, das trennen passiert ja immer erst am Ende des Skriptes, aber da ich keine Schleife habe dachte ich es wäre überhaupt nicht gut einfach 8 Pfade ins Skript zu schreiben weil er ja immer bei 4 Pfaden ins leere Fehler produziert. Ohne Fehler auswerfen wäre natürlich super, momentan generiert er mir eben jeden Tag ein Fehler beim Auswerfen.

Das Skript passe ich immer an bzgl. des abzurufenden Tages, da ich die USB Platten dann Lokal mit zu meinem Bruder oder meinen Eltern nehme, so haben die immer die selben Filme wie ich lokal gespeichert und ich kann da weiterschauen. Über UB2 hatte ich damals nichts gefunden bzgl. ab Tag und dann auch noch nur die definierten Files, und dann ist das tolle Skript entstanden.

Kannst du mir mal eine komplette Code Varinate zur Verfügung stellen, werde es dann mal versuchen zu verstehen und frage und teste dann mal.

Kommen wir nochmal zu den rechten, ich habe per WinSCP alle Rechte auf Root 777 gestellt, dann habe ich auch nochmal auf meinen Benutzer gestellt welcher Admin ist aber ruft das Skript oder eben ein anderes nicht auf. Vielleicht hast du ja noch einen Tipp was ich anders machen soll und versuchen soll. Wenn es am Ende nichts wird mit der iOS intigration, wäre es schade aber jetzt auch nicht schlimm. Ein Skript ist ja auch genial :). Wenn ich ubeigens über die App NASMeister über iOS auf die Skripte zugreife, dann kann ich die von außen ausführen, liegt also vielleicht doch am User. Nur bei der App sehe ich halt nicht ob es gerade läuft und deshalb wollte ich es in IOS Home (hombeidge/docker) integrieren, damit ich das schön per Schalter angezeigt bekomme. Der Schalter funktioniert ja auch schon wie gesagt.

Hoffe du kannst das alles lesen, hab den Text jetzt gerade mal per Handy geschrieben, bin gleich zuhause :).

Viele Grüße
Seger
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Da du ja docker benutzt, kannst du dir mal ioBroker anschauen, da kannst du auch noch 1000 andere Sachen bauen :)

Hab dir das nun mal erstellt, aber nicht getestet.
Es wird usb21 und usb22 abgefragt, sowie die genannten Quellen genutzt
Also erstmal Daten extra sichern und schauen ob es läuft.
Wie gesagt aber auf eigene Gefahr.



Rich (BBCode):
#!/bin/bash
touch "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI.flag"

echo '3-2' | tee /sys/bus/usb/drivers/usb/bind
sleep 30

AUSWAHLDATUM="2018-11-17"
LOGPFADFINAL="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Log Final.txt"
LOGPFADTEMP="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Temp.txt"
LOGFEHLERPFAD="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Fehler.txt"
timestamp() {
  date +"%d.%m.%Y - %T"
}
before=$(date)

# Ziel dev Path auslesen
zielmount=$(mount | grep -E "/volumeUSB2[1-2]/usbshare" | sed 's/ ..*//;s/[1-9]//')
if [ -n "$zielmount" ]; then
    # Ziel setzen
    if [ -d "/volumeUSB21/usbshare" ]; then 
        usb="/volumeUSB21/usbshare"
    elif [ -d "/volumeUSB22/usbshare" ]; then 
        usb="/volumeUSB22/usbshare"
    else
        echo "Ziel nicht gefunden!"
        exit 1
    fi
else    
    echo "Zielmount konnte nicht ausgelesen werden!"
    exit 2
fi

# Doppelte Absicherung / Abfrage ob usb festgelegt
[ -z "$usb" ] && echo "Ziel konnte nicht festgelegt werden"

# Schleife festlegen
for i in Konzerte Filme Kinderfilme Serien; do
    quelle="/volume1/DiskStation/- $i"
    ziel="$usb/- $i"        
    
    # Wenn Quelle nicht vorhanden, nächste Quelle
    [ ! -d "$quelle" ] && continue
    
    cd "$quelle" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ziel" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP
    awk 'BEGIN{c=0; do{printf "-"; c++}while(c<27); printf "\n"}' >> $LOGPFADTEMP
    echo -e "Diese Daten wurden kopiert:" >> $LOGPFADTEMP

    gesamtspeicherplatzderfestplatte() {
      df -h "$usb" | awk '/^"$usb" { print $2 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
    }
    belegterspeicherplatz() {
      df -h "$usb" | awk '/^"$usb" { print $3 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
    }
    freierspeicherplatz() {
      df -h "$usb" | awk '/^"$usb" { print $4 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
    }
    belegterspeicherplatzinprozent() {
      df -h "$usb" | awk '/^"$usb" { print $5 }' | tail --lines +2
    }
    after=$(date)
    timeDiff=$(date -u -d @$(($(date -d "$after" '+%s') - $(date -d "$before" '+%s'))) '+%M:%S')
    echo -e """\n""Freier Speicherplatz:"" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFADTEMP
    echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFADTEMP
    echo -e "\nScript-Laufzeit:" $timeDiff "Minuten/Sekunden" >> $LOGPFADTEMP
    echo -e "\nStartzeitpunkt: $(timestamp)\n" >> $LOGPFADTEMP
    tac "$LOGPFADTEMP" | sed 's/^.*-> /-> /' > "$LOGPFADFINAL"
done
sleep 30

# Platten trennen
umount "$usb"
hdparm -Y "$zielmount"
echo 1 > /sys/block/$zielmount/device/delete


# flag löschen
rm "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI.flag"
exit 0
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Moin Moin,

wie geil, DANKE erstmal! Also die Schleife läuft schon mal super durch, er hat sauber wie vorher kopiert und hat tatsächlich beide Pfade sauber geprüft und keine Fehler produziert.
Sensationell, viel geiler als vorher, schaue mir mal die gesamte Abfolge an um es zu verstehen.

Ich bleibe jetzt nochmal bei dem Thema bevor ich mich dem anderen Thema oder sogar ioBroker widme :).
2 Sachen laufen nämlich noch nicht rund.

Das 1. Thema ist das Einbinden bzw. das Ein/Ausbinden
.
- Meine NAS startet, die Platte erscheint in der DSM Oberfläche oben rechts "externe Geräte" und in der File Station
- Ich starte das Skript und es läuft wie oben beschrieben sauber durch und macht alles richtig von Daten richtig kopieren, .flag erstellen/löschen und die 3 Logs anlegen.

-- Doch dann bindet er wie folgt aus -> Oben rechts wird die externe Platte noch angezeigt und ich kann über den Button "entfernen" die Platte ausbinden. -> In der File Station wird die Platte zwar auch noch angezeigt, aber wenn ich drauf klicke wird mir kein Inhalt angezeigt obwohl sie welchen hat (ganz komisch, irgendwie nicht ganz ausgebunden, aber dann doch irgendwie). -->> Wenn ich jetzt das Skript nochmal ausführe (ohne Neustart der NAS oder einen Abziehen der Platte) wird das Skript zwar ausgeführt aber es findet kein Ende zumindest bleibt die .flag Datei immer dort.

Das 2 Thema ist das erstellte Log welches durch die Schleife jetzt vierfach erstellt wird und die abgerufenen Details nicht mehr ausgefüllt werden:

Rich (BBCode):
Startzeitpunkt: 03.01.2019 - 00:48:46

Script-Laufzeit: 00:08 Minuten/Sekunden

Belegter-Speicherplatz:  	 Belegter-Speicherplatz: 

Freier Speicherplatz:  		 Festplatten-Größe: 

Diese Daten wurden kopiert:
---------------------------
 
########################################################################################################################

Startzeitpunkt: 03.01.2019 - 00:48:46

Script-Laufzeit: 00:08 Minuten/Sekunden

Belegter-Speicherplatz:  	 Belegter-Speicherplatz: 

Freier Speicherplatz:  		 Festplatten-Größe: 

Diese Daten wurden kopiert:
---------------------------
 
########################################################################################################################

Startzeitpunkt: 03.01.2019 - 00:48:45

Script-Laufzeit: 00:07 Minuten/Sekunden

Belegter-Speicherplatz:  	 Belegter-Speicherplatz: 

Freier Speicherplatz:  		 Festplatten-Größe: 

Diese Daten wurden kopiert:
---------------------------
 
########################################################################################################################

Startzeitpunkt: 03.01.2019 - 00:48:39

Script-Laufzeit: 00:01 Minuten/Sekunden

Belegter-Speicherplatz:  	 Belegter-Speicherplatz: 

Freier Speicherplatz:  		 Festplatten-Größe: 

Diese Daten wurden kopiert:
---------------------------
 
########################################################################################################################

So sah es mal zum Beispiel aus:
Rich (BBCode):
Startzeitpunkt: 28.12.2018 - 16:54:45

Script-Laufzeit: 00:10 Minuten/Sekunden

Belegter-Speicherplatz: 328 Gigabyte 	 Belegter-Speicherplatz: 9%

Freier Speicherplatz: 3.3 Terabyte  	 Festplatten-Größe: 3.6 Terabyte

Diese Daten wurden kopiert:
---------------------------
 
########################################################################################################################
 
########################################################################################################################
 
########################################################################################################################
 
########################################################################################################################

Das Log ist ja nur zum Überprüfen, nicht total wichtig, da ist das Einbinden und Ausbinden schon wichtiger.

Danke für Deinen Einsatz und die tolle Hilfe!

Viele Grüße
Seger
 
Zuletzt bearbeitet:

himitsu

Benutzer
Sehr erfahren
Mitglied seit
22. Okt 2018
Beiträge
2.904
Punkte für Reaktionen
336
Punkte
123
Ich kann jetzt auch nichts direkt dazu sagen, aber wäre es nicht besser auf der USB-Platte ein Flag/Marker (z.B. Datei im Root) zu hinterlegen,
dann die gemunteten USB-Laufwerke aufzulisten, diese durchzugehen und die Platte mit dem Flag zu suchen, anstatt ein paar USBMointpounts fest im Script zu hinterlegen?
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Probier mal bitte folgendes:
Rich (BBCode):
#!/bin/bashtouch "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI.flag"

echo '3-2' | tee /sys/bus/usb/drivers/usb/bind
sleep 30

AUSWAHLDATUM="2018-11-17"
LOGPFADFINAL="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Log Final.txt"
LOGPFADTEMP="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Temp.txt"
LOGFEHLERPFAD="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Fehler.txt"
timestamp() {
  date +"%d.%m.%Y - %T"
}
before=$(date)
deleteflag() {
    rm "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI.flag"
    exit $1
}
# Ziel dev Path auslesen
zielmount=$(mount | grep -E "/volumeUSB2[1-2]/usbshare" | sed 's/ ..*//;s/[1-9]//')
if [ -n "$zielmount" ]; then
    # Ziel setzen
    if [ -d "/volumeUSB21/usbshare" ]; then 
        usb="/volumeUSB21/usbshare"
    elif [ -d "/volumeUSB22/usbshare" ]; then 
        usb="/volumeUSB22/usbshare"
    else
        echo "Ziel nicht gefunden!"
        deleteflag 1
    fi
else    
    echo "Zielmount konnte nicht ausgelesen werden!"
    deleteflag 2
fi

# Doppelte Absicherung / Abfrage ob usb festgelegt
[ -z "$usb" ] && echo "Ziel konnte nicht festgelegt werden"

# Schleife festlegen
for i in Konzerte Filme Kinderfilme Serien; do
    quelle="/volume1/DiskStation/- $i"
    ziel="$usb/- $i"        
    
    # Wenn Quelle nicht vorhanden, nächste Quelle
    [ ! -d "$quelle" ] && continue
    
    cd "$quelle" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ziel" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP
    awk 'BEGIN{c=0; do{printf "-"; c++}while(c<27); printf "\n"}' >> $LOGPFADTEMP
    echo -e "Diese Daten wurden kopiert:" >> $LOGPFADTEMP
done

dfh=$(df -h "$usb")
gesamtspeicherplatzderfestplatte() {
  echo "$dfh" | awk '/^$usb { print $2 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}
belegterspeicherplatz() {
  echo "$dfh" | awk '/^$usb { print $3 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}
freierspeicherplatz() {
  echo "$dfh" | awk '/^$usb { print $4 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}
belegterspeicherplatzinprozent() {
  echo "$dfh" | awk '/^$usb { print $5 }' | tail --lines +2
}
after=$(date)
timeDiff=$(date -u -d @$(($(date -d "$after" '+%s') - $(date -d "$before" '+%s'))) '+%M:%S')
echo -e """\n""Freier Speicherplatz:"" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFADTEMP
echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFADTEMP
echo -e "\nScript-Laufzeit:" $timeDiff "Minuten/Sekunden" >> $LOGPFADTEMP
echo -e "\nStartzeitpunkt: $(timestamp)\n" >> $LOGPFADTEMP
tac "$LOGPFADTEMP" | sed 's/^.*-> /-> /' > "$LOGPFADFINAL"
sleep 30

# Platten trennen
umount "$usb" && echo "umount $usb erfolgreich" || echo "umount $usb Fehler" 
hdparm -Y "$zielmount" && echo "hdparm -Y $zielmounl erfolgreich" || echo "hdparm -Y $zielmount Fehler"
echo 1 > /sys/block/$zielmount/device/delete && echo "echo 1 > /sys/block/$zielmount/device/delete erfolgreich" || echo "echo 1 > /sys/block/$zielmount/device/delete Fehler"
rmdir "$usb" && echo "rmdir $usb erfolgreich" || echo "rmdir $usb Fehler"

# flag löschen und exit
deleteflag 0



Die mounts werden halt beim Start ausgelesen, dass ist immer noch besser als festdefinierte Werte auszulesen und zu nutzen.
So im Script können auch keine Leerzeichen genutzt werden, da müsste man z.B. IFS setzen oder escapen.
Gibt viele Möglichkeiten sowas zu bauen. udev, Abfrage nach allen mounts usw.
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Hey mein Lieber,

wie immer herzlichen Dank für deine geniale Unterstützung und dein nicht locker lassen...

Die Optik des Logs ist nun richtig, habe es noch leicht angepasst und das "done" zwei Zeilen nach oben verschoben, nun ist das wieder so wie vorher und ich habe auch das Ende der Schleife verstanden ;-). Das einzige was noch immer nicht beim Log angezeigt wird ist die Abfrage nach den 4 Variablen (hier werden die Werte nicht mehr eingetragen):

Rich (BBCode):
echo -e """\n""Freier Speicherplatz:"" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFADTEMP
echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFADTEMP

Beispiel:
Rich (BBCode):
Startzeitpunkt: 03.01.2019 - 20:00:27

Script-Laufzeit: 00:22 Minuten/Sekunden

Belegter-Speicherplatz:  	 Belegter-Speicherplatz: 

Freier Speicherplatz:  		 Festplatten-Größe: 

Diese Daten wurden kopiert:
---------------------------
 
########################################################################################################################
 
########################################################################################################################
 
########################################################################################################################
 
########################################################################################################################

Das großes Problem bleibt aber weiterhin das "# Platten trennen", jetzt ist es so, dass die Platte nicht mehr in der FileStation angezeigt wird aber eben noch oben rechts in der DSM Oberfläche. Wenn ich das Skript danach einfach nochmal ausführe, generiert er mir unten den selben Pfad wieder die Platte aber mit einem zusätzlichen Namen USB_Krabbi_1"_1" und es werden zwei Platten angezeigt die aber das selbe sind. In dem Fall /volumeUSB22/usbshare. Nach einem Neustart ist wieder nur eine da (aber dann mit dem neuen Namen USB_Krabbi_1_1) welche aber auch weiterhin den richtigen Pfad hat: /volumeUSB22/usbshare.
Eigentlich egal, weil er ja nur den Namen ändert, aber richtig ist das nicht und leider trennt er einfach nicht richt und bindet auch nicht richt ein, da die Platte wie bereits geschrieben ja noch in der Benutzer-Oberfläche zusehen ist und die Platte auch dementsprechend auch nicht in den Ruhemodus geht.

Hast du noch eine Variante im Köcher?


Aktuelles Skript:

Rich (BBCode):
#!/bin/bash
touch "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI.flag"

echo '3-2' | tee /sys/bus/usb/drivers/usb/bind
sleep 30

AUSWAHLDATUM="2018-11-17"
LOGPFADFINAL="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Log Final.txt"
LOGPFADTEMP="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Temp.txt"
LOGFEHLERPFAD="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Fehler.txt"
timestamp() {
  date +"%d.%m.%Y - %T"
}
before=$(date)
deleteflag() {
    rm "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI.flag"
    exit $1
}
# Ziel dev Path auslesen
zielmount=$(mount | grep -E "/volumeUSB2[1-2]/usbshare" | sed 's/ ..*//;s/[1-9]//')
if [ -n "$zielmount" ]; then
    # Ziel setzen
    if [ -d "/volumeUSB21/usbshare" ]; then 
        usb="/volumeUSB21/usbshare"
    elif [ -d "/volumeUSB22/usbshare" ]; then 
        usb="/volumeUSB22/usbshare"
    else
        echo "Ziel nicht gefunden!"
        deleteflag 1
    fi
else    
    echo "Zielmount konnte nicht ausgelesen werden!"
    deleteflag 2
fi

# Doppelte Absicherung / Abfrage ob usb festgelegt
[ -z "$usb" ] && echo "Ziel konnte nicht festgelegt werden"

# Schleife festlegen
for i in Konzerte Filme Kinderfilme Serien; do
    quelle="/volume1/DiskStation/- $i"
    ziel="$usb/- $i"        
    
    # Wenn Quelle nicht vorhanden, nächste Quelle
    [ ! -d "$quelle" ] && continue
    
    cd "$quelle" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ziel" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP
done
    awk 'BEGIN{c=0; do{printf "-"; c++}while(c<27); printf "\n"}' >> $LOGPFADTEMP
    echo -e "Diese Daten wurden kopiert:" >> $LOGPFADTEMP

dfh=$(df -h "$usb")
gesamtspeicherplatzderfestplatte() {
  echo "$dfh" | awk '/^$usb { print $2 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}
belegterspeicherplatz() {
  echo "$dfh" | awk '/^$usb { print $3 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}
freierspeicherplatz() {
  echo "$dfh" | awk '/^$usb { print $4 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}
belegterspeicherplatzinprozent() {
  echo "$dfh" | awk '/^$usb { print $5 }' | tail --lines +2
}
after=$(date)
timeDiff=$(date -u -d @$(($(date -d "$after" '+%s') - $(date -d "$before" '+%s'))) '+%M:%S')
echo -e """\n""Freier Speicherplatz:"" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFADTEMP
echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFADTEMP
echo -e "\nScript-Laufzeit:" $timeDiff "Minuten/Sekunden" >> $LOGPFADTEMP
echo -e "\nStartzeitpunkt: $(timestamp)\n" >> $LOGPFADTEMP
tac "$LOGPFADTEMP" | sed 's/^.*-> /-> /' > "$LOGPFADFINAL"
sleep 30

# Platten trennen
umount "$usb" && echo "umount $usb erfolgreich" || echo "umount $usb Fehler" 
hdparm -Y "$zielmount" && echo "hdparm -Y $zielmounl erfolgreich" || echo "hdparm -Y $zielmount Fehler"
echo 1 > /sys/block/$zielmount/device/delete && echo "echo 1 > /sys/block/$zielmount/device/delete erfolgreich" || echo "echo 1 > /sys/block/$zielmount/device/delete Fehler"
rmdir "$usb" && echo "rmdir $usb erfolgreich" || echo "rmdir $usb Fehler"

# flag löschen und exit
deleteflag 0

Im Fehlerprotokoll ist alles sauber, und das Skript läuft auch sauber durch...

Edit Idee/Frage: Oder liegt es vielleicht auch gar nicht unten das Problem sondern vielleicht oben beim verbinden/mounten (nur ein Gedanke um dir ein wenig zu helfen !?!)

Danke für alles und herzliche Grüße
Seger
 
Zuletzt bearbeitet:

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Warum es bei dir nicht klappt, keine Ahnung hab es eben nochmal probiert und es läuft bei mir.
Wird das Gerät unter Einstellung/Externe Geräte noch angezeigt?

Probier mal folgendes:

Rich (BBCode):
#!/bin/bash
touch "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI.flag"

echo '3-2' | tee /sys/bus/usb/drivers/usb/bind
sleep 30

AUSWAHLDATUM="2018-11-17"
LOGPFADFINAL="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Log Final.txt"
LOGPFADTEMP="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Temp.txt"
LOGFEHLERPFAD="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Fehler.txt"
timestamp() {
  date +"%d.%m.%Y - %T"
}
before=$(date)
deleteflag() {
    rm "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI.flag"
    exit $1
}
# Ziel dev Path auslesen
zielmount=$(mount | grep -E "/volumeUSB2[1-2]/usbshare" | sed 's/ ..*//;s/[1-9]//')
if [ -n "$zielmount" ]; then
    # Ziel setzen
    if [ -d "/volumeUSB21/usbshare" ]; then 
        usb="/volumeUSB21/usbshare"
    elif [ -d "/volumeUSB22/usbshare" ]; then 
        usb="/volumeUSB22/usbshare"
    else
        echo "Ziel nicht gefunden!"
        deleteflag 1
    fi
else    
    echo "Zielmount konnte nicht ausgelesen werden!"
    deleteflag 2
fi


# Doppelte Absicherung / Abfrage ob usb festgelegt
[ -z "$usb" ] && echo "Ziel konnte nicht festgelegt werden"


# Schleife festlegen
for i in Konzerte Filme Kinderfilme Serien; do
    quelle="/volume1/DiskStation/- $i"
    ziel="$usb/- $i"        
    
    # Wenn Quelle nicht vorhanden, nächste Quelle
    [ ! -d "$quelle" ] && continue
    
    cd "$quelle" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ziel" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP
done
awk 'BEGIN{c=0; do{printf "-"; c++}while(c<27); printf "\n"}' >> $LOGPFADTEMP
echo -e "Diese Daten wurden kopiert:" >> $LOGPFADTEMP
gesamtspeicherplatzderfestplatte() {
  df -h --output=size "$usb" | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}
belegterspeicherplatz() {
  df -h --output=used "$usb" | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}
freierspeicherplatz() {
  df -h --output=avail "$usb" | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}
belegterspeicherplatzinprozent() {
  df -h --output=pcent "$usb" | tail --lines +2
}
after=$(date)
timeDiff=$(date -u -d @$(($(date -d "$after" '+%s') - $(date -d "$before" '+%s'))) '+%M:%S')
echo -e """\n""Freier Speicherplatz:"" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFADTEMP
echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFADTEMP
echo -e "\nScript-Laufzeit:" $timeDiff "Minuten/Sekunden" >> $LOGPFADTEMP
echo -e "\nStartzeitpunkt: $(timestamp)\n" >> $LOGPFADTEMP
tac "$LOGPFADTEMP" | sed 's/^.*-> /-> /' > "$LOGPFADFINAL"
sleep 30


# Platten trennen
umount "$usb" && echo "umount $usb erfolgreich" || echo "umount $usb Fehler" 
hdparm -Y "$zielmount" && echo "hdparm -Y $zielmounl erfolgreich" || echo "hdparm -Y $zielmount Fehler"
echo 1 > /sys/block/$zielmount/device/delete && echo "echo 1 > /sys/block/$zielmount/device/delete erfolgreich" || echo "echo 1 > /sys/block/$zielmount/device/delete Fehler"
rmdir "$usb" && echo "rmdir $usb erfolgreich" || echo "rmdir $usb Fehler"


# flag löschen und exit
deleteflag 0
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Hey ist gibt gute Nachrichten aber auch ein paar komische ...

Also das LOG funktioniert wieder zu 100%, alle Werte werden eingetragen und der Aufbau ist super! DANKE!

Das Auswerfen läuft wie folgt ab:

Wenn ich letzten Versuch nehme, dann wirf er mir die Platte zwar wieder in der FileSation aus, aber oben rechts nicht.

Wenn ich aber vor dem:
Rich (BBCode):
# flag löschen und exit
deleteflag 0

meine 2 alten Zeilen:
Rich (BBCode):
sleep 30
echo '3-2' | tee /sys/bus/usb/drivers/usb/unbind

einfüge, dann wirft er mir die Platte ohne Fehlermeldung auch oben rechts aus. Aber das Auswerfen ist irgendwie trotzdem nicht so wie vorher, denn wenn ich das Skript erneut starte, dann ist in der FileStation kurzfristig (so lange wie das Skript läuft) zwei Festplatten zu sehen, was aber eigentlich eine ist weil nur der Name fortlaufend mit einer _1 erweitert wird. Das ist nur der Name, hier gehe ich davon aus, dass die Platte beim einbinden einfach nicht den selben Namen verwenden kann und sich einfach einen fortlaufenden nimmt. Das "Auswerfen" funktioniert dann am Ende aber trotzdem und "beide" Platte sind danach in der FileStation nicht mehr sichtbar und die eine Platte oben rechts auch nicht. Prizipiell ist das ja nicht schlimm das er sich kurzfristig einen zweiten Namen nimmt, das Auswerfen rein optisch funktioniert ja. Wenn ich dann im übrigen das Skript ein drittes Mal starte sind auf einmal "3 Platten" zusehen (immer so weiter). Wenn ich die DiskStation komplett neustarte, ist nur die eine wieder da, dann hat er die ganzen Namen wohl aus dem Speicher gehauen. --> Was aber ein Problem ist, dass die Platte nach den Skriptvorgang nicht mehr in den Ruhezustand geht, weil sie anscheinend nicht so ausgeworfen wird wie damals mit Fehlermeldung:

Rich (BBCode):
echo '3-2' | tee /sys/bus/usb/drivers/usb/bind
echo '3-2' | tee /sys/bus/usb/drivers/usb/unbind

Eine Kleinigkeit noch, im Code habe ich einen Tippfehler entdeckt:
Rich (BBCode):
# Platten trennen
umount "$usb" && echo "umount $usb erfolgreich" || echo "umount $usb Fehler" 
hdparm -Y "$zielmount" && echo "hdparm -Y $zielmount erfolgreich" || echo "hdparm -Y $zielmount Fehler"
echo 1 > /sys/block/$zielmount/device/delete && echo "echo 1 > /sys/block/$zielmount/device/delete erfolgreich" || echo "echo 1 > /sys/block/$zielmount/device/delete Fehler"
rmdir "$usb" && echo "rmdir $usb erfolgreich" || echo "rmdir $usb Fehler"

Den habe ich von "1" auf "t" geändert, was aber auch nicht das Problem war, keine Veränderung im Ablauf (oder war das kein Fehler?).

Ich sende dir nochmal den aktuellen Status, vielleicht fällt dir ja was auf bzgl. der bind/unbind Geschichte:

Rich (BBCode):
#!/bin/bash
touch "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI.flag"

echo '3-2' | tee /sys/bus/usb/drivers/usb/bind
sleep 30

AUSWAHLDATUM="2018-12-30"
LOGPFADFINAL="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Log Final.txt"
LOGPFADTEMP="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Temp.txt"
LOGFEHLERPFAD="/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/Fehler.txt"
timestamp() {
  date +"%d.%m.%Y - %T"
}
before=$(date)
deleteflag() {
    rm "/volume1/DiskStation/Programme/USB-Festplatten/Krabbi/USB_KRABBI.flag"
    exit $1
}
# Ziel dev Path auslesen
zielmount=$(mount | grep -E "/volumeUSB2[1-2]/usbshare" | sed 's/ ..*//;s/[1-9]//')
if [ -n "$zielmount" ]; then
    # Ziel setzen
    if [ -d "/volumeUSB21/usbshare" ]; then 
        usb="/volumeUSB21/usbshare"
    elif [ -d "/volumeUSB22/usbshare" ]; then 
        usb="/volumeUSB22/usbshare"
    else
        echo "Ziel nicht gefunden!"
        deleteflag 1
    fi
else    
    echo "Zielmount konnte nicht ausgelesen werden!"
    deleteflag 2
fi


# Doppelte Absicherung / Abfrage ob usb festgelegt
[ -z "$usb" ] && echo "Ziel konnte nicht festgelegt werden"


# Schleife festlegen
for i in Konzerte Filme Kinderfilme Serien; do
    quelle="/volume1/DiskStation/- $i"
    ziel="$usb/- $i"        
    
    # Wenn Quelle nicht vorhanden, nächste Quelle
    [ ! -d "$quelle" ] && continue
    
    cd "$quelle" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.mkv" -or -name "*.avi" -or -name "*.mp4" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ziel" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP
done
awk 'BEGIN{c=0; do{printf "-"; c++}while(c<27); printf "\n"}' >> $LOGPFADTEMP
echo -e "Diese Daten wurden kopiert:" >> $LOGPFADTEMP
gesamtspeicherplatzderfestplatte() {
  df -h --output=size "$usb" | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}
belegterspeicherplatz() {
  df -h --output=used "$usb" | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}
freierspeicherplatz() {
  df -h --output=avail "$usb" | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}
belegterspeicherplatzinprozent() {
  df -h --output=pcent "$usb" | tail --lines +2
}
after=$(date)
timeDiff=$(date -u -d @$(($(date -d "$after" '+%s') - $(date -d "$before" '+%s'))) '+%M:%S')
echo -e """\n""Freier Speicherplatz:"" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFADTEMP
echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFADTEMP
echo -e "\nScript-Laufzeit:" $timeDiff "Minuten/Sekunden" >> $LOGPFADTEMP
echo -e "\nStartzeitpunkt: $(timestamp)\n" >> $LOGPFADTEMP
tac "$LOGPFADTEMP" | sed 's/^.*-> /-> /' > "$LOGPFADFINAL"
sleep 30


# Platten trennen
umount "$usb" && echo "umount $usb erfolgreich" || echo "umount $usb Fehler" 
hdparm -Y "$zielmount" && echo "hdparm -Y $zielmount erfolgreich" || echo "hdparm -Y $zielmount Fehler"
echo 1 > /sys/block/$zielmount/device/delete && echo "echo 1 > /sys/block/$zielmount/device/delete erfolgreich" || echo "echo 1 > /sys/block/$zielmount/device/delete Fehler"
rmdir "$usb" && echo "rmdir $usb erfolgreich" || echo "rmdir $usb Fehler"

sleep 30
echo '3-2' | tee /sys/bus/usb/drivers/usb/unbind

# flag löschen und exit
deleteflag 0

Danke mein Lieber!

Viele Grüße
Seger
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
@PsychoHH

Update: anscheinend habe ich meine DS ein wenig überfordert die letzten Tage und mein letzter Post funktioniert jetzt doch zu 100000%!!! Danke mein Lieber, du hast mir aus zwei Skripte eines gemacht welches auch noch nicht mehr den Fehler beim auswerfen generiert. Witzig, dass der umbind Befehl aus dem ursprünglichen Skript dann in Kombination zu deinen genialen Ideen dazu geführt hat, das es nun komplett funktioniert.

Das einzige was nachwie vor so ist wie ich bereits oben geschrieben habe, ist das, dass die Synology bei jedem ausführen eine „neue“ Platte mit fortlaufenden Namen hinzufügt. Das sehe ich aber ja nur wenn ich gerade in der FileStation schaue, wenn das Skript gerade läuft. Das stört mich aber nicht und wird wohl wegen dem Namenmanagment auch normal sein.

Also wie gesagt es läuft alles :)))), die Platte geht auch in den Ruhezustand.

Mit dem eigentlichen Thema bin ich aber nich nicht weiter. Keine Ahnung ob es an Docker und Root und den Rechten hängt, aber der Schalter in IOS führt das Skript nicht aus. Versuche das nochmal weiter, vielleicht kannst du mich dabei ja nochmal begleiten? Vielleicht ist das auch einfach eine dumme Idee von mir und du hast eine Alternative für mich. Würde gern per Handy (iOS) meine Skripte gerne starten und beenden und das am liebsten sauber ordentlich per App. Eine saubere optische Darstellung meiner Skripte war schon cool.

Ich Danke dir vielmals mein Lieber!

Viele Grüße
Seger
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Das freut mich schon mal.

Die Sache ist einfach auch, dass ich keine bind Befehle nutze oder Quasi devices deaktiviere.
Es gab hier mal eine Anleitung wie man USB/Sata Geräte fest in die DS einträgt.


Ich werde aber wenn ich soweit mit UB2 durch bin ein Tool erstellen, mit dem man per Link bestimmte Scripte starten kann.
Mit Homematic kenne ich mich aber leider null aus, da nie benutzt :/
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Die Anleitung kenne ich und hab ich auch schon gemacht, sonst hätten die Platten auch nicht immer den selben Pfad \usb21 ... das funktioniert ganz gut über USB DeviceMap oder so (aus dem Kopf geschrieben). Die Namen die jetzt fortlaufend gesetzt werden, werden wahrscheinlich durch das DSM Management und dem Mount-Befehlen gesetzt und erst nach einen Reboot gelöscht, aber ist kein Problem.

Nutze jetzt wieder die NASMeister App (iOS), damit kann man seine Skripte starten und bekommt die auch aufgelistet. Nur beenden kann man die dort nicht und die Textdarstellung müsste optimiert werden. Die App kommt auch aus dem Forum hier, ist im englische Bereich zu finden, kannst du die ja mal bei Gelegenheit anschauen. Ich werde den Entwickler mal anschreiben und ihm einige Verbesserungsvorschläge reinreichen. Wenn du dich dem Thema widmest, komm gern auf mich zu, werde gerne alles für dich testen.

Danke nochmal fürs helfen!!!

Viele Grüße Seger
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat