在bash脚本中控制可执行文件

时间:2013-05-24 15:23:13

标签: linux bash

首先,我不知道如何搜索我想做的事情。

我有一个exec在终端(Linux)中生成输出。 我们来看一个简单的C程序a.out:

#include <stdio.h>
int main (int argc, char *argv[]) {
int i=0;
float j=0;
for(i=0; i<=10000000;i++)
  {
    j = i*-1e-5;
    printf (" %d 2.0 %f 4.0 5.0\n",i,j);
  }
}

产生的输出如下:

 0 2.0 -0.000000 4.0 5.0
 1 2.0 -0.000010 4.0 5.0
 2 2.0 -0.000020 4.0 5.0
 3 2.0 -0.000030 4.0 5.0
 ...

根据此输出,我想:

  1. 启动此exec
  2. “捕获”输出
  3. 如果第3列值达到-0.5,则停止/终止执行
  4. 你将如何做到这一点?

    例如,exec不会因此脚本exec.sh而停止:

    #/bin/sh
    PROG=./a.out
    $PROG > output  &
    progpid=$!
    
    (tail -fn 0 output & echo $! > tailpid ) | awk -v progpid=$progpid '{
        if($3<=-0.5){
          system("kill "progpid)
          # system( ##update other file )
          system("kill $(<tailpid)")
        }
     }'
    

    有什么想法吗?

    提前致谢

1 个答案:

答案 0 :(得分:1)

我认为这种构造解决了你的所有观点:

programname > output &
progpid=$!
(tail -fn 0 output & echo $! > tailpid ) | awk -v progpid=$progpid '{ 
    if( condition ) { 
        system("kill "progpid)
        system( ##update other file )
        system("kill $(<tailpid)")
    }
}'

我们在后台运行程序并将输出重定向到output。然后我们监视output,因为它使用tail -f选项进行更新,该选项在添加文件末尾时从文件末尾读取行。然后我们将它管道输入awk,如果满足条件,它可以运行系统命令来终止程序进程,然后运行另一个命令来更新单独文本文件中的参数,然后运行另一个命令来杀死{{1}这样它就不会永远挂在后台(tail也会在awk被杀死后退出。