【问题标题】:Shell script task status monitoringShell脚本任务状态监控
【发布时间】:2010-05-19 07:46:11
【问题描述】:

我正在后台运行一个 ANT 任务,并每隔 60 秒检查一次该任务是否完成。如果不是,则每 60 秒,屏幕上应显示一条消息 - “部署进程仍在运行。自部署开始后的 $slept 秒数”,其中 $slept 为 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

现在,问题是 - 此代码不起作用。这看起来像一个非常好的代码,但是,这不起作用。谁能指出这段代码有什么问题。

【问题讨论】:

  • 您能否更具体地说明它是如何不起作用的?
  • 他在之前的问题 stackoverflow.com/questions/2810757/… 的 cmets 中提到,他并不总是看到“仍在运行”消息。
  • @pra:感谢您的指点。 OP 应该将这些信息带到这个问题。

标签: unix shell ant scripting


【解决方案1】:

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

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

编辑:

您的代码流程如下:

  • 调用 deploy_check
    • 循环直到睡眠超过限制(此时将是 1260)
    • 如果部署成功则中断
  • 如果还在运行,提示用户
  • 如果用户按下 Ctrl-C,脚本会退出,但 ant deploy 会继续运行(除非您在脚本的其他位置设置了陷阱来处理 Ctrl-C 并在 ant deploy 进程上执行 kill )
  • 如果用户按下回车键,限制会提高到 1500
  • 调用 deploy_check 测试睡眠 ==1260 与限制 ==1500
    • 循环直到睡眠超过限制(此时将是 1560)
    • 如果部署成功则中断
  • 脚本(或其中的这一部分)结束而不再次提示用户

您需要一个循环来使提示再次出现。

【讨论】:

  • 另外,根据您问题中的代码与脚本中可能存在的其他代码的关系,可能需要将slept(重新)初始化为零(或取消设置)。
  • 使用者第一次选择继续后,限制增加 300 秒。 300 秒后,他将再次获得继续或杀死的相同选项。限制和睡眠变量仅在给定的代码段中使用,在我的脚本中的其他任何地方都没有使用。让我感到困惑的是,代码有时可以工作,有时却不能工作。这就像一个松散的连接。 :(
  • @Bikram Agarwal:代码的写法,不会提示用户第二次。我指的是代码与变量的关系。如果此代码周围存在循环或 deploy_check 在其他地方被调用,则变量值可能会以意想不到的方式发生变化。另外,请参阅我编辑的答案以获取代码的流跟踪,以便您了解为什么它不会再次提示用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
相关资源
最近更新 更多