在用户输入上停止avconv Bash脚本并继续循环

时间:2013-07-10 09:49:11

标签: bash while-loop avconv

基本上(希望)我想从网络摄像头录制视频流并将其保存在特定目录中,然后在用户输入一些数字时将其删除。我没有这么好解释,所以这就是我现在正在做的事情:

#!/bin/bash

while true
do

TIMESTAMP=$(date +"%Y.%m.%d_%H.%M")

read -p "Enter your number here: " YOURNUMBER

echo -e "Saving video stream:"

mkdir /home/$USER/orders/$YOURNUMBER

avconv -f video4linux2 -r 3 -fs 52428800 -i /dev/video0 /home/$USER/orders/$YOURNUMBER/$TIMESTAMP-$YOURNUMBER.avi

echo -e "Video complete!"

done

所以我想停止录制并在新的$ YOURNUMBER文件夹中开始新的操作。有任何想法吗? (相当新的......耐心等待!)

更新

感谢@TrueY

更新了脚本(不需要mkdir真的这么做了):

CPID=0
while :; do
  read -p "Enter your number here: " YOURNUMBER
  [ $CPID -ne 0 ] && kill -INT $CPID
  TIMESTAMP=$(date +"%Y.%m.%d_%H.%M")
  avconv -f video4linux2 -r 3 -fs 52428800 -i /dev/video0 /home/$USER/orders/$YOURNUMBER[packed-$TIMESTAMP].avi > /dev/null 2>&1 &
  CPID=$!
done

唯一的问题是我(或最终用户)必须在再次开始录制之前输入两次数字。

1 个答案:

答案 0 :(得分:2)

<强>已更新

尝试这样的事情(OP的代码稍作修改):

#!/usr/bin/bash

stop() { [ $CPID -ne 0 ] && kill -INT $CPID && wait $CPID && echo "Killed $CPID"; }

trap "stop; exit" INT

CPID=0
while :; do
  read -p "Enter your number here: " YOURNUMBER
  stop
  [ "$YOURNUMBER" == quit ] && break;
  TIMESTAMP=$(date +"%Y.%m.%d_%H.%M")
  avconv -f video4linux2 -r 3 -fs 52428800 -i /dev/video0 /home/$USER/orders/$YOURNUMBER/$TIMESTAMP-$YOURNUMBER.avi&
  CPID=$!
  echo -e "Video complete!"
done

这会在后台启动,以便用户输入新号码。也许的stdout和stderr应该重定向到日志文件或/ dev / null。还应测试哪个信号优先停止-INT相当于ctrl + c。它不起作用,如果没有其他帮助,请尝试-HUP-TERM甚至-KILL。也许你应该实现一个trap来捕捉INT信号来杀死最后它按下ctrl + c。