shell编程中的超时控制

 最近遇到个需求, 就是当进程运行超过一定的时间限制后, 自动退出. 隔壁钟老板给找了个脚本, 记下来:
#!/bin/sh

#function : begin_timer HANDLER_NAME MICROSECONDS CMD_ON_TIMEOUT ARGS...
# @HANDLER_NAME : handler of timer
# @MICROSECONDS : micro seconds to wait
# @CMD_ON_TIMEOUT ARGS : command and its arguments to run when timeout
start_timer(){
[ $# -lt 2 ] && return 1
HANDLER=$1
TIMER=$2
shift 2
(
trap exit USR1
sleep $TIMER
"$@"
)& #后台执行sleep, 如果超时, 则执行"$@"(timeout)
eval export $HANDLER=$! #后台子shell的pid, 赋值给$HANDLER为名字的变量
}
export -f start_timer

#function : kill_timer HANDLER_NAME
# @HANDLER_NAME : timer handler to indicate which timer to kill
kill_timer(){
kill -USR1 ${!1} # ${1}为名字的变量的值, 这里为$HAND, 及子进程pid
}
export -f kill_timer


trap exit USR1

timeout(){
echo timeout
kill -USR1 $1 # $1为主进程pid
}

start_timer HAND 5 timeout $$
echo -n "READ : "
read F
kill_timer HAND
echo "GOT : "$F

 

#!/bin/bash
# timed-input.sh
# TMOUT=3
TIMELIMIT=3 # 设置时间为超时为3秒
PrintAnswer()
{
if [ "$answer" = TIMEOUT ]
then
echo $answer #打印Int14Vector的answer的值.
else # ..........
echo "Your favorite veggie is $answer"
kill $! # kill将不再需要TimerOn函数运行在后台,否则timeron应该是在后台一直运行!
# $! 是运行在后台的最后一个工作的PID,也就是这个脚本是最后运行的一个进程。
fi
}
TimerOn()
{
sleep $TIMELIMIT && kill -s 14 $$ & #*这句很关键,意思是说设定守侯的时间,并在后台运行,不影响任何用户的动作、,只是到时间用户没有反映是,发出信号并停止.如果没有&,则到时间退出,看不到提问,如果没有kill -s 14 $$,则一直停止在提问题的地方,不会正常等到时间时退出,如果这两个都没有,那么将等到时间时,才能看到提问,而且一直停止在提问的地方.---详细的>>{放在回答问题(echo -n "问题")之前意思是如果用户没有输入任何字符,将等待$TIMELIMIT秒,将发送一个信号,并结束此脚本,如果这行没有"&"(这个符号表示在后台运行该脚本),那么此程序就是在3秒之内输入了回答也不能马上退出并显示结果,需要等到3秒的时候才能退出,并且看不到提问语句.,因为有了&,这个sleep和kill语句将在后台运行,用户看不到,所以可以看到提问语句,只要回答按回车就可以退出,如果没有&,无论你输不输入答案sleep都在前台运行,等sleep运行完后,才能执行kill,.如果没有"kill -s 14 $$"命令,时间开关,意思是3秒执行它,$$表示本句的进程.如果没有这句话,需要等待sleep执行完以后才能执行下边的程序,这里也就是回答问题退出,但是不回答问题将永远停留在让你输入问题的地方了(echo -n "问题"),}累蒙了
# ..3.,............
}
Int14Vector()
{
answer="TIMEOUT"
PrintAnswer
exit 14
}
trap Int14Vector 14 #意思是捕获信号,执行指定的程序.(参考unix-linux shell编程的26章trap命令) 如果到时间用户没有反映,trap将捕获到上边kill发出的14信号,运行int14vector函数.运行printanswer,打印出 answer就会为TIMEOUT.如果用户有反映,那么将执行read读取标准输入,运行printanswer打印出用户的输入.
echo "What is your favorite vegetable "
TimerOn #如果echo没有加-n就放在echo的下边,如果有-n,就放在echo的上边.
read answer
PrintAnswer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值