Linux 无限循环shell脚本未被终止

Linux 无限循环shell脚本未被终止,linux,bash,shell,Linux,Bash,Shell,我正在尝试使用shell脚本在linux中执行一些任务(mysql上的基准测试,这将需要1或2个小时),同时,我需要并行运行另一个脚本,每10或20分钟执行一次任务输出,并将输出写入一个文件。现在,一旦任务完成,我想停止第二个脚本并获得输出。但这并没有发生。以下是我迄今为止所做的: 任务脚本-我正在执行一个1或2小时的任务 #!/bin/sh #Here I'm doing some task which takes upto 1 hr #For simulating test sleep 10

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

任务脚本-我正在执行一个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
#!/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-并行运行两个脚本的主脚本

#!/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
#!/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
后,输出如下

  • 10秒后生成task.txt

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

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

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

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


提前感谢

此处的代码:

wait $pid1
ret1=$?
wait $pid2
将确保它等待两个进程完成,因此
mainscript
将永远不会到达
kill
语句

这是因为
infintequery
(我假设它是无限的,但我将以与您相同的方式拼写它)将永远不会退出,
mainscript
将永远在
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
启动之前运行(可能的情况是后者最终可能会使用前者的一些信息)。如果不必先运行,您可以通过不在后台运行来简化:

#!/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

另一个soln,不改变主脚本,如果不习惯等待和PID。 在infintequery文件的循环中添加此行

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

所以你能告诉我如何纠正这个问题吗。我不熟悉这些东西。谢谢。那太完美了。我明白等待pid2会导致我的脚本挂起。但在您上次编辑的部分中,没有等待,因此我无法使用该表单使其工作。它在执行后立即完成。@HRM,在最后一个代码段中,没有
wait$pid1
,因为它实际上没有在后台运行(已删除
&
)。主脚本将在前台启动它,这意味着它将自动等待它完成。