我必须在bash脚本中运行一些程序。有时的程序可能不给出结果。
#!/bin/sh
for k in $( seq 1 20)
do
echo -n ${k}' ' >> 2.txt
./s${k}>>2.txt & sleep 5
done
我的理想结果:
1 result001
2 result002
3
4 result004
但是在运行我的代码后,结果是
1 result001
2 result002
3 4 result004
所以我的问题是如何在bash脚本中成功检查程序运行?谢谢!
这应该对您有用。
#!/bin/bash
for k in {1..20}
do
result=$(./s${k} & sleep 5)
printf "%b %bn" $k $result >> 2.txt
done
测试此脚本时给出以下输出:
1 result1
2 result2
3
4 result4
尝试使用wait
http://en.wikipedia.org/wiki/wait_(command)
等待[n]
其中n是当前执行背景的PID或作业ID 过程(作业)。如果不给出n,命令将等到所有作业 调用外壳已知已终止。
等待正常返回最后一个工作的退出状态 终止。如果n指定a,它也可能返回127 如果没有工作要等待。
因为等待需要注意当前外壳的工作表 执行环境,通常将其实现为内置的外壳。
只需在此行之后添加wait
./s${k}>>2.txt & sleep 5
wait
如果过程可以死锁 - 另一个选择是timeout
timeout -s 9 5 ./s${k}>>2.txt # Waits 5 seconds and then kill the process
您可以依次调用作业并使用timeout
限制执行时间:
#!/bin/sh
for k in $( seq 1 20)
do
echo -n ${k}' ' >> 2.txt
timeout -k 8 5 ./s${k}>>2.txt
done
这将在5秒钟后用TERM
信号(通过信号处理程序进行清理)终止每个作业,如果不成功,则在8秒后使用KILL
信号。
但是,从您的外壳的角度来看,不涉及平行过程,您不需要解决任何并发问题。