MEncoder 和 Youtube-upload 脚本如果失败则重试

MEncoder 和 Youtube-upload 脚本如果失败则重试

我有一个脚本,每天对视频进行编码(cron 作业),该视频在创建后立即上传到 YouTube。虽然有时这些脚本会失败。

如果其中一个或两个命令都失败,我该如何让脚本重试这两个命令?

剧本:

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

我想要实现的命令是

  • mencoder-无声音....
  • video_link=$(youtube-upload--email=xxx...

答案1

您可以将两个关键命令包装在一个循环中:

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

$? 存储最后一条命令的返回代码。“0”表示成功,其他任何数字都表示失败。在方括号内,我将此返回代码与“0”进行比较。如果它们相等,则比较结果为“true”,这意味着我们进入了“if”块(如果您使用此块,请注意括号周围的空格,它们很重要)。我发出一个“break”,告诉 for 循环应立即终止,并且不再进行任何进一步的迭代。简而言之:如果 critical_command 成功,则继续执行程序的其余部分。

如果您的命令输出被捕获在变量中,例如您的 video_link,这也有效。对于上传工具,建议在重试之前稍作暂停,因为服务器可能很忙:

critical_command
sleep 10 # wait for 10 seconds

我会单独包装每个命令,即使这不是最优雅的解决方案(您可以创建一个包装函数,它会重试作为参数给出的命令 - 但不确定这是否在 bash 中有效)。

相关内容