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
Hey mein Lieber,

jetzt benötige doch nochmal Hilfe. Ich habe hier zwei unterschiedliche Skripte die immer den oben skizzierten Muster folgen. Das eigentliche Skript konnte ich bereits umwandeln:

Skript 1 (das erstellte von uns "dir", welches ja jetzt zu 100% funktioniert):

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

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

AUSWAHLDATUM="2018-12-30"
LOGPFADFINAL="/volume1/DiskStation/Programme/Skripte/1LOGS/USB/Krabbi/Log Final.txt"
LOGPFADTEMP="/volume1/DiskStation/Programme/Skripte/1LOGS/USB/Krabbi/Temp.txt"
LOGFEHLERPFAD="/volume1/DiskStation/Programme/Skripte/1LOGS/USB/Krabbi/Fehler.txt"
timestamp() {
  date +"%d.%m.%Y - %T"
}
before=$(date)
deleteflag() {
    rm "/volume1/DiskStation/Programme/Skripte/1LOGS/USB/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

Skript 2 (hab ich auf die andere Platte angepasst und funktioniert auch zu 100% :)):
- Einziger Unterschied ist USB31/32 und das "AUSWAHLDATUM"
- Achso Skript1/2 sind fertig, die brauchen nicht per schleife zusammengefasst werden, da es für mich so viel sauberer ist wegen dem unterschiedlichen Datum.

Rich (BBCode):
#!/bin/bash
touch "/volume1/DiskStation/Programme/Skripte/1LOGS/USB/Beger/USB_Beger.flag"

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

AUSWAHLDATUM="2018-12-23"
LOGPFADFINAL="/volume1/DiskStation/Programme/Skripte/1LOGS/USB/Beger/Log Final.txt"
LOGPFADTEMP="/volume1/DiskStation/Programme/Skripte/1LOGS/USB/Beger/Temp.txt"
LOGFEHLERPFAD="/volume1/DiskStation/Programme/Skripte/1LOGS/USB/Beger/Fehler.txt"
timestamp() {
  date +"%d.%m.%Y - %T"
}
before=$(date)
deleteflag() {
    rm "/volume1/DiskStation/Programme/Skripte/1LOGS/USB/Beger/USB_Beger.flag"
    exit $1
}
# Ziel dev Path auslesen
zielmount=$(mount | grep -E "/volumeUSB3[1-2]/usbshare" | sed 's/ ..*//;s/[1-9]//')
if [ -n "$zielmount" ]; then
    # Ziel setzen
    if [ -d "/volumeUSB31/usbshare" ]; then 
        usb="/volumeUSB31/usbshare"
    elif [ -d "/volumeUSB32/usbshare" ]; then 
        usb="/volumeUSB32/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-1' | tee /sys/bus/usb/drivers/usb/unbind

# flag löschen und exit
deleteflag 0
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
So nun bräuchte ich aber nochmal deine Hilfe...
Die DiskStation startet jeden Tag neu und somit verbinden sich die beiden USB-Platten ja auch jeden Tag automatisch neu mit dem System. Jetzt wollte ich aus dem mount/unmount/bind/unbind-Ansatz die definierten Platten wieder ausbinden nachdem die DiskStation gestartet ist.

Jetzt habe ich das versucht und es funktioniert auch zu 99,9%, doch das Problem ist das die Meldung wieder kommt das die Platten nicht ordnungsgemäß ausgebunden wurden. Kann es sein das ich beim zusammenschreiben was übersehen habe, ich glaube der Mount/Unmount-Bereich funktioniert nicht so wie gewünscht. Oder kann ich das sich so nicht machen? Ich glaube du verstehst es wenn du dir das Skript anschaust:

Rich (BBCode):
#!/bin/bash

# Definierte Platten binden ###########################

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

# (usb21-usb22) #####################################

# Ziel dev Path auslesen (usb21-usb22)
zielmount1=$(mount | grep -E "/volumeusb2[1-2]/usbshare" | sed 's/ ..*//;s/[1-9]//')
if [ -n "$zielmount1" ]; then
    # Ziel setzen
    if [ -d "/volumeusb21/usbshare" ]; then 
        usb1="/volumeusb21/usbshare"
    elif [ -d "/volumeusb22/usbshare" ]; then 
        usb1="/volumeusb22/usbshare"
    else
        echo "Ziel nicht gefunden!"
        deleteflag 1
    fi
else    
    echo "zielmount1 konnte nicht ausgelesen werden!"
    deleteflag 2
fi

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

# USB Platten (usb21-usb22) trennen
umount "$usb1" && echo "umount $usb1 erfolgreich" || echo "umount $usb1 Fehler" 
hdparm -Y "$zielmount1" && echo "hdparm -Y $zielmount1 erfolgreich" || echo "hdparm -Y $zielmount1 Fehler"
echo 1 > /sys/block/$zielmount1/device/delete && echo "echo 1 > /sys/block/$zielmount1/device/delete erfolgreich" || echo "echo 1 > /sys/block/$zielmount1/device/delete Fehler"
rmdir "$usb1" && echo "rmdir $usb1 erfolgreich" || echo "rmdir $usb1 Fehler"

# (usb31-usb32) #####################################

# Ziel dev Path auslesen (usb31-usb32)
zielmount2=$(mount | grep -E "/volumeusb3[1-2]/usbshare" | sed 's/ ..*//;s/[1-9]//')
if [ -n "$zielmount2" ]; then
    # Ziel setzen
    if [ -d "/volumeusb31/usbshare" ]; then 
        usb2="/volumeusb31/usbshare"
    elif [ -d "/volumeusb32/usbshare" ]; then 
        usb2="/volumeusb32/usbshare"
    else
        echo "Ziel nicht gefunden!"
        deleteflag 1
    fi
else    
    echo "zielmount2 konnte nicht ausgelesen werden!"
    deleteflag 2
fi

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

# USB Platten (usb31-usb32) trennen
umount "$usb2" && echo "umount $usb2 erfolgreich" || echo "umount $usb2 Fehler" 
hdparm -Y "$zielmount2" && echo "hdparm -Y $zielmount2 erfolgreich" || echo "hdparm -Y $zielmount2 Fehler"
echo 1 > /sys/block/$zielmount2/device/delete && echo "echo 1 > /sys/block/$zielmount2/device/delete erfolgreich" || echo "echo 1 > /sys/block/$zielmount2/device/delete Fehler"
rmdir "$usb2" && echo "rmdir $usb2 erfolgreich" || echo "rmdir $usb2 Fehler"

# Definierte Platten ausbinden ###########################

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

# flag löschen und exit
deleteflag 0

Würde mich sehr freuen wenn du mir nochmal über die Schulter schauen könntest.

Viele liebe Grüße
Seger
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
@PsychoHH @all wollte mal hoffleich nachfragen ob sich jemand schon meinen letzten Post anschauen könnte und mir unter die Arme greifen könnte?

Viele Grüße
Seger
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Wirklich keiner da der mir vielleicht nochmal helfen kann? @PsychoHH scheint momentan offline zu sein. Würde mich sehr freuen.
@Fusion vielleicht?

Viele Grüße
Seger
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Du hast im aktuellen Script die Funktion deleteflag vergessen.
Das Problem ist einfach, ich nutze keine bind/unbind Befehle um Geräte/einzelne Geräte zu mounten, weswegen es hier evtl. zu der Meldung kommen kann.

Wieso lässt du es nicht einfach so von Synology mounten?
 

seger85

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

entschuldige meine späte Rückmeldung, war beruflich sehr eingebunden.

Die kleiner Fuchs, du siehst auch alles, das hab ich wohl vergessen gehabt zu kopieren. Und als ich mir dann nochmal den fertigen Code genau angeschaut hatte, habe ich gesehen das ich beim Mountbefehl im Pfad das USB kleine "usb" kleingeschrieben hatte. Lange Rede .... ;-), mit deinem Tipp und dem Anpassen des Rechtschreibfehlers hat es dann geklappt :).

Für die Nachwelt ein Code mit dem man einzelne USB-Platten ohne Fehlermeldung ausbilden kann:

Rich (BBCode):
#!/bin/bash
touch "/volume1/DiskStation/Programme/Skripte/1LOGS/USB_Unbind/USB_Unbind.flag"

# Definierte Platten binden ###########################

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

deleteflag() {
    rm "/volume1/DiskStation/Programme/Skripte/1LOGS/USB_Unbind/USB_Unbind.flag"
    exit $1
}

# (usb21-usb22) #####################################

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

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

# USB Platten (usb21-usb22) trennen
umount "$usb1" && echo "umount $usb1 erfolgreich" || echo "umount $usb1 Fehler" 
hdparm -Y "$zielmount1" && echo "hdparm -Y $zielmount1 erfolgreich" || echo "hdparm -Y $zielmount1 Fehler"
echo 1 > /sys/block/$zielmount1/device/delete && echo "echo 1 > /sys/block/$zielmount1/device/delete erfolgreich" || echo "echo 1 > /sys/block/$zielmount1/device/delete Fehler"
rmdir "$usb1" && echo "rmdir $usb1 erfolgreich" || echo "rmdir $usb1 Fehler"

# (usb31-usb32) #####################################

# Ziel dev Path auslesen (usb31-usb32)
zielmount2=$(mount | grep -E "/volumeUSB3[1-2]/usbshare" | sed 's/ ..*//;s/[1-9]//')
if [ -n "$zielmount2" ]; then
    # Ziel setzen
    if [ -d "/volumeUSB31/usbshare" ]; then 
        usb2="/volumeUSB31/usbshare"
    elif [ -d "/volumeUSB32/usbshare" ]; then 
        usb2="/volumeUSB32/usbshare"
    else
        echo "Ziel nicht gefunden!"
        deleteflag 3
    fi
else    
    echo "zielmount2 konnte nicht ausgelesen werden!"
    deleteflag 4
fi

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

# USB Platten (usb31-usb32) trennen
umount "$usb2" && echo "umount $usb2 erfolgreich" || echo "umount $usb2 Fehler" 
hdparm -Y "$zielmount2" && echo "hdparm -Y $zielmount2 erfolgreich" || echo "hdparm -Y $zielmount2 Fehler"
echo 1 > /sys/block/$zielmount2/device/delete && echo "echo 1 > /sys/block/$zielmount2/device/delete erfolgreich" || echo "echo 1 > /sys/block/$zielmount2/device/delete Fehler"
rmdir "$usb2" && echo "rmdir $usb2 erfolgreich" || echo "rmdir $usb2 Fehler"

# Definierte Platten entbinden ###########################

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

# flag löschen und exit
deleteflag 0

Danke Dir nochmal für die sensationelle Hilfe! Wie schon mal gesagt, solltest du dich irgendwann dem Thema Skripte "App" widmen oder so ähnlich, stehe ich Dir jederzeit zur Verfügung!

Viele Grüße
Seger
 
Zuletzt bearbeitet von einem Moderator:

Krocko

Benutzer
Mitglied seit
06. Dez 2017
Beiträge
19
Punkte für Reaktionen
0
Punkte
1
Hallo @seger85.

Hast du mittlerweile eine Möglichkeit gefunden, um deine Skripte über iOS (homebridge/HomeKit) zu starten?

Ich habe früher meine homebridge auf dem Pi gehabt.
Dort habe ich das Plugin homebridge-cmdtrigger genutzt, um über HomeKit bestimmte Skripte und Befehle auszuführen.
Das Plugin hat in HomeKit einen Schalter erstellt, der beim Aktivieren das in der config.json hinterlegte Skript, oder den hinterlegten Befehl ausgeführt hat.
Leider funktioniert das im Docker nicht mehr.
Das Plugin lässt sich zwar installieren und der Schalter wird in HomeKit auch angezeigt, aber die hinterlegten Skripte und Befehle werden nicht ausgeführt.
 
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