Shell脚本任务状态监视

时间:2010-05-19 07:46:12

标签: unix shell ant scripting

我正在后台运行ANT任务,并以60秒的间隔检查该任务是否完成。如果不是,每隔60秒,屏幕上就会显示一条消息 - “部署过程仍然在运行。自部署开始以来已经过了几秒钟”,其中$ sleep是60,120,180 n等等。

有1200秒的限制,之后脚本将通过'ant log'命令显示日志,并询问用户是否继续。如果用户选择继续,则会在时间限制内添加300秒,然后重复该过程。

我用于此任务的代码是 -

ant deploy &

limit=1200
deploy_check()
{
while [ ${slept:-0} -le $limit ]; do
    sleep 60 && slept=`expr ${slept:-0} + 60`
    if [ $$ = "`ps -o ppid= -p $!`" ]; then
        echo "Deploy process is still running. $slept seconds since deploy started."
    else
        wait $! && echo "Application ${New_App_Name} deployed successfully" || echo "Deployment of ${New_App_Name} failed"
        break
    fi
done
}

deploy_check

if [ $$ = "`ps -o ppid= -p $!`" ]; then
   echo "Deploy process did not finish in $slept seconds. Here's the log."
   ant log
   echo "Do you want to kill the process? Press Ctrl+C to kill. Press Enter to continue."
   read log
limit=`expr ${limit} + 300`
   deploy_check
fi

现在,问题是 - 这段代码无效。这看起来像一个非常好的代码,然而,这是行不通的。任何人都可以指出这个代码有什么问题。

1 个答案:

答案 0 :(得分:1)

如果用户选择继续,deploy_check再次运行,但用户再也没有机会继续或取消(尽管可以随时按下Ctrl-C)。所以你可能希望将它包装在while循环中。

此外,按Ctrl-C可能不会杀死子进程。您需要提示是或否,如果是,请执行kill $!

修改

以下是您的代码流程:

  • 调用deploy_check
    • 循环直到睡眠超过限制(此时将为1260)
    • 如果部署成功则中断
  • 如果它仍在运行,请提示用户
  • 如果用户按下Ctrl-C,脚本将退出,但ant deploy仍处于运行状态(除非脚本中的其他位置设置了陷阱,用于处理Ctrl-C并对其执行kill ant deploy流程)
  • 如果用户按Enter键,则限制将提高到1500
  • 调用deploy_check测试睡眠== 1260对抗限制== 1500
    • 循环直到睡眠超过极限(此时将是1560)
    • 如果部署成功则中断
  • 脚本(或其中此部分)结束时不再提示用户

您需要一个循环才能再次出现提示。