MEncoder & Youtube-upload Scripts tentam se falharem

0

Eu tenho um script que codifica um vídeo todos os dias (cron job) e este vídeo é enviado para o youtube logo após a sua criação. Embora algumas vezes esses scripts falhem.

Como posso fazer o script para repetir esses dois comandos se um deles ou ambos falharem?

O script:

#!/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

Os comandos que eu quero implementar são

  • mencoder-nosound ....
  • video_link = $ (youtube-upload --email = xxx ...
por Manos 17.10.2014 / 11:20

1 resposta

1

Você pode envolver seus dois comandos críticos em um loop:

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

$? armazena o código de retorno do último comando. "0" significa sucesso, qualquer outra coisa significa falha. Entre os colchetes, eu comparo esse código de retorno com "0". Se eles forem iguais, a comparação renderá "true", o que significa que entramos no bloco "if" (se você usar isso, preste atenção nos espaços em branco ao redor dos colchetes, eles são importantes ). Lá eu emito um único "break", que diz ao loop for que ele deveria terminar imediatamente, e não fazer mais iterações. Resumindo: se o critical_command foi bem sucedido, continue com o resto do programa.

Isso também funciona se a saída do seu comando for capturada em uma variável, como no seu video_link. Para a ferramenta de upload, pode ser aconselhável adicionar uma pequena pausa antes de tentar novamente, pois o servidor pode estar ocupado:

critical_command
sleep 10 # wait for 10 seconds

Eu envolveria cada comando separadamente, mesmo que não seja a solução mais elegante (você poderia criar uma função wrapper, que tenta novamente o comando dado como um argumento - não tenho certeza se isso funciona no bash).

    
por 17.10.2014 / 13:58