最近遇到个需求, 就是当进程运行超过一定的时间限制后, 自动退出. 隔壁钟老板给找了个脚本, 记下来:
#!/bin/sh
#function : begin_timer HANDLER_NAME MICROSECONDS CMD_ON_TIMEOUT ARGS...
# @HANDLER_NAME :
# @MICROSECONDS :
# @CMD_ON_TIMEOUT ARGS : command and its arguments to run when timeout
start_timer(){
}
export -f start_timer
#function : kill_timer HANDLER_NAME
# @HANDLER_NAME : timer handler to indicate which timer to kill
kill_timer(){
}
export -f kill_timer
trap exit USR1
timeout(){
}
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