我必须在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脚本中成功运行?谢谢!
答案 0 :(得分:1)
这应该适合你。
#!/bin/bash
for k in {1..20}
do
result=$(./s${k} & sleep 5)
printf "%b %b\n" $k $result >> 2.txt
done
测试此脚本时给出了以下输出:
1 result1
2 result2
3
4 result4
答案 1 :(得分:0)
尝试使用wait
http://en.wikipedia.org/wiki/Wait_%28command%29
等[n]
其中n是当前正在执行的背景的pid或作业ID 过程(工作)。如果未给出n,则命令将一直等到所有作业 已知调用shell已终止。
等待正常返回上一个作业的退出状态 终止。如果n指定a,它也可以返回127 不存在的工作,如果没有工作要等,则为零。
因为wait需要知道当前shell的作业表 执行环境,它通常作为shell内置实现。
只需在此行之后添加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
答案 2 :(得分:0)
您可以按顺序调用作业并使用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
信号终止。
但是从shell的角度来看,不涉及并行进程,也不需要解决任何并发问题。