5

我有一个 shell 脚本,它将build.xml文件传输到远程 unix 机器(devrsp02 )并在该机器(devrsp02 )上执行 ANT 任务wldeploy。现在,这个 wldeploy 任务大约需要 15 分钟才能完成,当它运行时,unix 控制台的最后一行是 -

“任务{一些数字}已初始化”。

一旦这个任务完成,我们会得到一个“任务完成”消息,脚本中的下一个任务只有在那之后才会执行。

但有时,weblogic 域可能存在问题,并且部署可能会在内部失败,而不会影响 wldeploy 任务的状态。unix 控制台仍将停留在“任务 {some digit} 已初始化”。部署错误将记录在名为 output.a 的文件中

所以,我现在想要的是——

在运行 wldeploy 之前启动时间计数器。如果 wldeploy 运行超过 15 分钟,则应运行以下命令 -

tail -f output.a ## 不终止 wldeploy

或者

cat output.a ## 强制终止 wldeploy 后

这里要注意的一点是 - 我无法在后台运行 wldeploy 任务,因为在这种情况下,用户将无法知道任务何时完成,这对于此脚本至关重要。

您能否提出任何建议来实现这一目标?

4

3 回答 3

3

创建此脚本(deploy.sh例如):

#!/bin/sh
sleep 900 && pkill -n wldeploy && cat output.a &
wldeploy 

然后从控制台

chmod +x deploy.sh

然后运行

./deploy.sh

该脚本将启动一个计数器(15 分钟),如果进程正在运行,它将强制终止wldeploy进程,如果进程正在运行,您将看到output.a.

如果脚本已终止,则pkill不会返回 true 并且output.a不会显示。

我会称这个任务监控而不是“并行处理”:)

于 2010-05-11T12:54:25.320 回答
1

这只会杀死它启动的 wldeploy 进程,告诉您 wldeploy 返回成功还是失败,并在 wldeploy 完成后运行不超过 30 秒。

它应该是 sh 兼容的,但是我现在可以访问的 /bin/sh 似乎有一个损坏的等待命令。

#!/bin/ksh 
wldeploy &
while [ ${slept:-0} -le 900 ]; do
    sleep 30 && slept=`expr ${slept:-0} + 30`
    if [ $$ = "`ps -o ppid= -p $!`" ]; then
        echo wldeploy still running
    else
        wait $! && echo "wldeploy succeeded" || echo "wldeploy failed"
        break
    fi
done
if [ $$ = "`ps -o ppid= -p $!`" ]; then
   echo "wldeploy did not finish in $slept seconds, killing it"
   kill $!
   cat output.a
fi
于 2010-05-11T16:58:59.143 回答
0

对于没有终止 wldeploy 的部分很容易,只需在之前执行

  { sleep 900; tail -f output.a; } &

对于带有 kill it 的部分,它更复杂,因为您已经确定了 wldeploy 进程的 PID。pra 的答案正是这样做的,所以我只是参考一下。

于 2012-09-22T07:40:25.817 回答