shell脚本超时自杀处理

分类:软件编程
阅读:442
作者:majingjing
发布:2016-10-19 14:20

java在执行linux命令的时候是很弱的,所以有时候需要借助shell脚本来完成相关的功能,比如系统的内存释放,数据库的定时备份等. 下面就列举一个在项目中使用到的视频截图功能,这个要想用java来实现还是很复杂的,但是编写shell就非常easy了. java在调用脚本的时候就会出现脚本异常崩溃,或其他的类库出现异常无法终止,导致进程一直挂着,如果一直执行这个脚本,就会导致内存居高不下,最终导致服务器宏机.

现在示例一个带有超时处理的shell脚本

#!/bin/sh -e

#define function
handle_timeout()
{
    echo "exit cmd faild" > timeout
}
timeout()
{
    waitfor=20
    commands=$*
    $commands &
    commandspid=$!
    (sleep $waitfor;kill -9 $commandspid > /dev/null 2>&1 && handle_timeout) &
    watchdog=$!
    wait $commandspid > /dev/null 2>&1
    kill $watchdog > /dev/null 2>&1
    wait $watchdog > /dev/null 2>&1
}
captureLive_cmd()
{
    ./ffmpeg -ss 0 -i $STREAM_URL -f image2 -vframes 1 -y $PNG_OUT_FILE"/test.jpg">/dev/null 2>&1
}
test_func()
{
    sleep $sleep_time
}

#define global variable
HDFS_ROOT=$1
PNG_OUT_FILE=$2
STREAM_URL=$3

sleep_time=30

#main
cd $1
timeout captureLive_cmd
#timeout test_func
sleep 3
if [ ! -f "timeout" ];then
    exit 0   #success
else
    rm -rf timeout
    exit 1  #failed
fi
#echo $HDFS_ROOT $PNG_OUT_FILE $STREAM_URL

#cd $1
#nohup ./ffmpeg -ss 0 -i $STREAM_URL -f image2 -vframes 1 -y $PNG_OUT_FILE"/test.jpg" 2>&1 |grep "Stream discovered after head already parsed" &
#sleep 20 && kill -9 $!