MEncoder & Youtube-upload Scripts wiederholen, wenn sie fehlschlagen

491
Manos

Ich habe ein Skript, das jeden Tag ein Video codiert (cron job), und dieses Video wird direkt nach seiner Erstellung auf youtube hochgeladen. Manchmal scheitern diese Skripts.

Wie kann ich das Skript veranlassen, diese beiden Befehle erneut auszuführen, wenn einer oder beide fehlschlagen?

Das Skript:

#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  echo $(date) cd /home/pi/ ls *.jpg > stills.txt  DATE=$(date --date=yesterday +"%Y-%m-%d") three_days_ago=$(date --date="3 days ago" "+%m-%d") yesterday=$(date --date yesterday "+%m-%d") video_name=$(date +"%m-%d")   mencoder -nosound -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=8000000 -vf scale=1920:1080 -o $yesterday.avi -mf type=jpeg:fps=10 mf://@stills.txt  video_link=$(youtube-upload --email=xxx --password=xxx--title="Timelapse Video of "$yesterday --description="Heraklion Timelapse Video of "$yesterday \ --category=Tech --keywords="Raspberry PI, Timelapse" /home/pi/$yesterday.avi)  echo $video_link youtube-upload --email=xxx --password=xxx--add-to-playlist http://gdata.youtube.com/feeds/api/playlists/PLbjjzh8UkLN2pQTZwXyQ4kP2bXb7Zwtmo $video_link   echo $(date) /home/pi/Desktop/camera/Dropbox-Uploader/dropbox_uploader.sh upload /home/pi/Desktop/camera/video_maker.log /Public/pi_videos find . -type f -name $DATE\* -exec rm {} \; rm $three_days_ago.avi 

Die Befehle, die ich implementieren möchte, sind

  • Mencoder -Nosound ....
  • video_link = $ (youtube-upload --email = xxx ...)
0

1 Antwort auf die Frage

1
Isaac

Sie könnten Ihre zwei kritischen Befehle in einer Schleife umschließen:

max_retries=3 for i in $(seq $);do critical_command if [ $? == 0 ];then break fi done 

$? speichert den Rückgabewert des letzten Befehls. "0" bedeutet Erfolg, alles andere bedeutet Fehler. Innerhalb der eckigen Klammern vergleiche ich diesen Rückgabewert mit "0". Wenn sie gleich sind, ergibt der Vergleich "true", dh wir betreten den "if" -Block (wenn Sie diesen verwenden, achten Sie auf die Leerzeichen um die Klammern, sie sind wichtig ). Dort gebe ich eine einzelne "break" aus, die der for-Schleife sagt, dass sie sofort beendet werden sollte und keine weiteren Iterationen durchführen soll. Kurz gesagt: Wenn der critical_command erfolgreich war, fahren Sie mit dem Rest des Programms fort.

Dies funktioniert auch, wenn die Ausgabe Ihres Befehls in einer Variablen abgefangen wird, wie bei video_link. Für das Uploader-Tool kann es ratsam sein, vor dem erneuten Versuch eine kleine Pause hinzuzufügen, da der Server möglicherweise ausgelastet ist:

critical_command sleep 10 # wait for 10 seconds 

Ich würde jeden Befehl separat einpacken, auch wenn dies nicht die eleganteste Lösung ist (Sie könnten eine Wrapper-Funktion erstellen, die den als Argument angegebenen Befehl wiederholt - nicht sicher, ob dies in bash funktioniert).

Kannst du mir erklären, was das bedeutet? wenn [$? == 0], dann brechen Manos vor 9 Jahren 0
Ich habe meine Antwort bearbeitet, um dies etwas zu erklären. Isaac vor 9 Jahren 0