Linux 无限循环shell脚本未被终止
我正在尝试使用shell脚本在linux中执行一些任务(mysql上的基准测试,这将需要1或2个小时),同时,我需要并行运行另一个脚本,每10或20分钟执行一次任务输出,并将输出写入一个文件。现在,一旦任务完成,我想停止第二个脚本并获得输出。但这并没有发生。以下是我迄今为止所做的: 任务脚本-我正在执行一个1或2小时的任务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
#!/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分钟更新一次 秒
提前感谢此处的代码:
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
,因为它实际上没有在后台运行(已删除&
)。主脚本将在前台启动它,这意味着它将自动等待它完成。