无限循环shell脚本没有被杀死

时间:2013-09-11 01:34:15

标签: linux bash shell

我正在尝试使用shell脚本在linux上进行一些任务(在mysql上进行基准测试,这将需要1或2个小时),同时我自己需要并行运行另一个脚本,这将需要输出每10或20分钟执行一次任务,并将输出写入文件。现在,一旦任务完成,我想停止第二个脚本并获得输出。但它没有发生。这是我到目前为止所做的:

taskscript - 我正在执行1小时或2小时的任务

#!/bin/sh
#Here I'm doing some task which takes upto 1 hr
#For simulating test
sleep 10
echo "Task Finished" > "task.txt";

infintequery - 将并行输出任务的脚本

#!/bin/sh

while true; 
do
sleep 10;
#Here I'm querying task result and store it to a an output file with timestamp
#For simulating test, just writing time only
echo $(date +"%m/%d %T") >> "infinite.txt";
done

mainscript - 并行运行两个脚本的主脚本

#!/bin/sh

sh ./taskscript 1>/dev/null 2>&1 &
pid1=$!

sh ./infintequery 1>/dev/null 2>&1 &
pid2=$!

wait $pid1
ret1=$?
wait $pid2
ret2=$?

if [ $ret1 -eq 0 ]
then 
   echo "Completed succesfully"
   kill $pid2
else
    echo "Failed to complete script"
fi

执行./mainscript后,输出

  • task.txt在10秒后生成

  • infinite.txt每10秒附加一次时间。

  • 脚本永远不会完成,infinite.txt每10次更新一次 秒。

我希望主题脚本在任务脚本完成后停止执行,但主题也没有完成,即使在我给Ctrl-C之后,infinite.txt仍然会更新。

所以伙计们,请帮我解决这个问题。我在这做错了什么?我在shell脚本中没有经验,这些代码都是从SO本身的一些帖子中获取的。

提前致谢

2 个答案:

答案 0 :(得分:1)

这段代码在这里:

wait $pid1
ret1=$?
wait $pid2

将确保它等待两个进程完成,因此mainscript永远不会进入kill语句。

那是因为infintequery(我认为这意味着无限,但我将以与你相同的方式拼写)永远不会退出,mainscript将永远等待{{1}行。

如果您只想等待wait $pid2完成然后杀掉taskscript,请使用以下内容:

infintequery

无论#!/bin/sh sh ./taskscript 1>/dev/null 2>&1 & pid1=$! sh ./infintequery 1>/dev/null 2>&1 & pid2=$! wait $pid1 ret1=$? kill $pid2 if [ $ret1 -eq 0 ] then echo "Completed successfully" else echo "Failed to complete script" fi 是否成功,只需等待taskscript完成然后终止infintequery

当然,假设taskscript必须在taskscript开始之前运行(可能的情况,因为后者可能会最终使用前者的一些信息)。如果必须先运行,您可以通过不在后台运行来简化:

infintequery

答案 1 :(得分:0)

另一个没有改变你的主要剧本的解决方案,如果不熟悉等待和pids。 在infintequery文件中循环添加此行。

if [ `grep "Task Finished" input | wc -l` -eq 1 ]; then exit; fi