(Bash/Cronjob) printf: broken pipe

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
irgendwas
Beiträge: 278
Registriert: 04.04.2016 18:53:19
Lizenz eigener Beiträge: MIT Lizenz

(Bash/Cronjob) printf: broken pipe

Beitrag von irgendwas » 11.07.2017 21:48:20

Hallo zusammen,
ich bin langsam mit meinem Latein am Ende und erbitte euren Rat :mrgreen:

Ich habe ein Skript, dass in der Konsole einwandfrei funktioniert: Eine laufende VM wird gesichert, exportiert und anschließend wieder gestartet.
Sobald ich das Skript als Cronjob startet, bekomme ich eine E-Mail mit dem freundlichen Hinweis:
/pfad/zum/skript/skript.sh: Zeile 24: printf: Schreibfehler: Datenübergabe unterbrochen (broken pipe).
/pfad/zum/skript/skript.sh: Zeile 25: printf: Schreibfehler: Datenübergabe unterbrochen (broken pipe).
/pfad/zum/skript/skript.sh: Zeile 31: printf: Schreibfehler: Datenübergabe unterbrochen (broken pipe).
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
/pfad/zum/skript/skript.sh: Zeile 42: printf: Schreibfehler: Datenübergabe unterbrochen (broken pipe).
/pfad/zum/skript/skript.sh: Zeile 42: printf: Schreibfehler: Datenübergabe unterbrochen (broken pipe).
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
/pfad/zum/skript/skript.sh: Zeile 58: printf: Schreibfehler: Datenübergabe unterbrochen (broken pipe).
/pfad/zum/skript/skript.sh: Zeile 58: printf: Schreibfehler: Datenübergabe unterbrochen (broken pipe).
/pfad/zum/skript/skript.sh: Zeile 72: printf: Schreibfehler: Datenübergabe unterbrochen (broken pipe).
Die VM wird erfolgreich gesichert, exportiert und anschließend wieder gestartet. Das einzig "störende" ist die E-Mail, in der etwas positive(re)s stehen sollte - damit man sofort erkennt "Backup erfolgreich" :mrgreen:

Ich hab inzwischen alle Kommandos bzw. die Pfade im Skript geprüft, aber soweit ist alles stimmig. Ich vermute deswegen, dass am Cronjob noch irgendwas anders sein muss, als in Konsole..? :?

..und zum Schluss:
Das ganze läuft auf Openmediavault 2.2.14

Code: Alles auswählen

root@homeserver:~# cat /proc/version
Linux version 3.16.0-0.bpo.4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.6.3 (Debian 4.6.3-14) ) #1 SMP Debian 3.16.39-1+deb8u1~bpo70+1 (2017-02-24)
...und das Skript: (ich hoff es überschreitet nicht die Grenze um es in NoPaste zu packen)

Code: Alles auswählen

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export PATH
# =======================================================
# =======================================================
VMNAME="debian8"
EXPORTDIR="/media/zielverzeichnis/$VMNAME"
VBOXMANAGE="/usr/bin/VBoxManage -q"
DATE=$(date +%Y-%m-%d_%H-%M)
DAYS="30"
# =======================================================
# =======================================================
 
ERR="nothing"
SECONDS=0
 
# Get the vm state
VMSTATE_EXPORT=$(vboxmanage showvminfo $VMNAME --machinereadable > /media/zielverzeichnis/$VMNAME-status.log)
VMSTATE=$(awk -F '=' '$1 == "VMState" { printf $2 }' /media/zielverzeichnis/$VMNAME-status.log)
printf "=====================================================\n$VMNAME\n=====================================================\n"
printf "$VMNAME: $VMSTATE\n\n"

# If the VM's state is running or paused, save its state
if [[ $VMSTATE == \"running\" || $VMSTATE == \"paused\" ]];
    then
        printf "Shutting down $VMNAME..."
        vboxmanage controlvm "$VMNAME" savestate
        if [ $? -ne 0 ];
            then ERR="saving the state";
        fi
fi
sleep 5

# Export the vm as appliance
if [ "$ERR" == "nothing" ];
    then
        printf "$VMNAME is down!\nExporting $VMNAME..."
        vboxmanage export "$VMNAME" --ovf20 --output ${EXPORTDIR}/${VMNAME}_${DATE}.ova
        if [ $? -ne 0 ];
            then
                ERR="exporting"
            else
                # Get file size
                FILESIZE=$(du -h ${EXPORTDIR}/${VMNAME}_${DATE}.ova | cut -f 1)
        fi
    else
        printf "Not exporting because the VM's state couldn't be saved."
fi
 
# Resume the VM to its previous state if that state was paused or running
if [[ $VMSTATE == \"running\" || $VMSTATE == \"paused\" ]];
    then
        printf "Filename: ${VMNAME}_${DATE}.ova\nResuming previous state..."
        vboxmanage startvm "$VMNAME" --type headless
            if [ $? -ne 0 ];
                then ERR="resuming";
            fi
            if [ $VMSTATE == \"paused\" ];
                then
                    vboxmanage controlvm $VMNAME pause
                    if [ $? -ne 0 ];
                        then ERR="pausing";
                    fi
            fi
fi

printf "Deleted files older than $DAYS days:"
find ${EXPORTDIR} -type f -mtime +${DAYS} -ls
find ${EXPORTDIR} -type f -mtime +${DAYS} -delete

TomL

Re: (Bash/Cronjob) printf: broken pipe

Beitrag von TomL » 11.07.2017 22:40:41

Ich würde jetzt sagen, wenn cron den Job startet gibts keinen Ausgabe-Bildschirm. Leite alle Ausgaben in eine Datei um oder besser, verzichte auf Ausgaben, wenn der Job von Cron gestartet wurde und schreib die Ausgaben stattdessen ins Log rein.

irgendwas
Beiträge: 278
Registriert: 04.04.2016 18:53:19
Lizenz eigener Beiträge: MIT Lizenz

Re: (Bash/Cronjob) printf: broken pipe

Beitrag von irgendwas » 11.07.2017 23:57:19

Danke für die schnelle Antwort :wink:

Daran dachte ich auch, aber -und das hätte ich oben noch erwähnen sollen- funktionierte die Ausgabe zuletzt am 08.07.2017:
=====================================================
Windows7
=====================================================

Windows7: "poweroff"

Windows7 is down!
Exporting Windows7...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Successfully exported 1 machine(s).
Deleted files older than 30 days:
Ich hab mich auch schon gefragt, ob irgendein Update vielleicht dafür verantwortlich sein könnte, aber es gab lediglich beiden Einträge

Code: Alles auswählen

/var/log/apt/history.log

Start-Date: 2017-07-07  12:14:17
Commandline: apt-get --yes --force-yes --fix-missing --auto-remove --allow-unauthenticated --show-upgraded --option DPkg::Options::=--force-confold install libgcrypt11
Upgrade: libgcrypt11:amd64 (1.5.0-5+deb7u5, 1.5.0-5+deb7u6)
End-Date: 2017-07-07  12:14:18

Start-Date: 2017-07-09  18:30:31
Commandline: apt-get --yes --force-yes --fix-missing --auto-remove --allow-unauthenticated --show-upgraded --option DPkg::Options::=--force-confold install libsqlite3-0 sqlite3
Upgrade: sqlite3:amd64 (3.7.13-1+deb7u3, 3.7.13-1+deb7u4), libsqlite3-0:amd64 (3.7.13-1+deb7u3, 3.7.13-1+deb7u4)
End-Date: 2017-07-09  18:30:32
..bis dahin hab ich an dem Skript nichts verändert. Gut, inzwischen ist das ein oder andere verändert, weil ich alternativen zu "echo" gesucht/gefunden hab :D

Aber die Idee mit der Logdatei gefällt mir. Ich probiers mal mir den Inhalt als E-Mail zuschicken zu lassen, danke :THX:

Benutzeravatar
Meillo
Moderator
Beiträge: 9231
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: (Bash/Cronjob) printf: broken pipe

Beitrag von Meillo » 12.07.2017 06:53:03

Die Zeilennummern der Fehlermeldungen passen nicht zum Script. Eine Zeile 72 gibt's zum Beispiel gar nicht. Passt die Version des Scripts wirklich zu dieser Version der Fehlermeldungen und heisst das Script auch ``script.sh''? (Es kommen Fehlermeldungen wegen printf, das es in deinem Script aber gar nicht gibt.)

Wie sieht denn dein Cronjob-Eintrag aus? Probier dort mal etwas in der Art:

Code: Alles auswählen

/path/to/script.sh >/tmp/stdout.txt 2>/tmp/stderr.txt
Dann solltest du noch versuchen, das Problem einzugrenzen, indem du dein Script schrittweise zusammenkuerzt, bis so wenige Codezeilen wie moeglich genau eine Fehlermeldung erzeugen. Dann weiss man naemlich wo man hinschauen muss.

Und `set -x' koennte beim Debuggen auch helfen.
Use ed once in a while!

irgendwas
Beiträge: 278
Registriert: 04.04.2016 18:53:19
Lizenz eigener Beiträge: MIT Lizenz

Re: (Bash/Cronjob) printf: broken pipe

Beitrag von irgendwas » 12.07.2017 09:10:20

Meillo hat geschrieben: ↑ zum Beitrag ↑
12.07.2017 06:53:03
Passt die Version des Scripts wirklich zu dieser Version der Fehlermeldungen und heisst das Script auch ``script.sh''?
Stimmt, ich hab aus dem Skript ein paar alte Zeilen (die dann zu Kommentaren wurden) entfernt. Grundsätzlich stimmt die Fehlermeldung aber schon. Zu jeder Zeile, in der ein printf steht, ein Fehler.

Ich habs jetzt vorübergehend mit einem weiteren Skript "gelöst"

Code: Alles auswählen

#!/bin/bash
# ==============================================
VBOXNAME="Name_der_VM"
EMAIL="empfaenger@domain.de"
# ==============================================

/bin/bash /pfad/zum/skript/$VBOXNAME.sh > /pfad/zum/skript/$VBOXNAME.log
/usr/bin/mail -s "Backup: $VBOXNAME" $EMAIL < /pfad/zum/skript/$VBOXNAME.log

exit
Seltsam finde ich ja nur, dass es vorher bis zum Samstag (08.07.2017) über Wochen einwandfrei funktioniert hatte. Die Fehlermeldung "broken pipe" kenn ich eigentlich nur, wenn man auch einen Operator benutzt...

Code: Alles auswählen

BEFEHL1 | BEFEHL2
..aber in meinem Skript wird in den Zeilen "nur" was ausgegeben und abgesehen von dem Fehler, wird die VM trotzdem gesichert, exportiert und der Ursprungszustand wiederhergestellt. :?
Meillo hat geschrieben: ↑ zum Beitrag ↑
12.07.2017 06:53:03
Wie sieht denn dein Cronjob-Eintrag aus?
Da das bei Openmediavault über die WebGUI läuft, sieht es so aus:
Bild

Antworten