0

我正在尝试使用 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 秒后生成

  • 每 10 秒为无限.txt 附加时间。

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

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

所以各位,请帮我解决这个问题。我在这里做错了什么?我在 shell 脚本方面没有那么有经验,这些代码都取自 SO 本身的一些帖子。

提前致谢

4

2 回答 2

1

这段代码在这里:

wait $pid1
ret1=$?
wait $pid2

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

那是因为infintequery(我认为那是无限的,但我会像你一样拼写)永远不会退出并且mainscript永远在排队等候wait $pid2

如果您只想等待taskscript完成然后 kill off 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开始之前运行(很可能的情况,因为后者可能最终会使用来自前者的一些信息)。如果它不必先运行,您可以通过不在后台运行它来简化:

#!/bin/sh

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

sh ./taskscript 1>/dev/null 2>&1
ret1=$?

kill $pid2
if [ $ret1 -eq 0 ]
then 
   echo "Completed successfully"
else
    echo "Failed to complete script"
fi
于 2013-09-11T01:42:54.957 回答
0

另一个解决方案,无需更改您的主脚本,如果对等待和 pid 不满意。在 infintequery 文件的循环中添加这一行。

if [ `grep "Task Finished" input | wc -l` -eq 1 ]; then exit; fi
于 2013-09-11T10:04:24.833 回答