如何检查程序在bash脚本中运行成功?

时间:2015-05-05 11:27:19

标签: linux bash

我必须在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脚本中成功运行?谢谢!

3 个答案:

答案 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的角度来看,不涉及并行进程,也不需要解决任何并发问题。