我正在尝试使用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本身的一些帖子中获取的。
提前致谢
答案 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