2015-05-20 54 views
1

我有几个程序需要以某种顺序运行(p1然后p2然后p3然后p4)。 通常我只会做一个简单的脚本或P1型& & P2 & & P3 & & P4。在Unix中连续运行程序

但是,这些程序不能正确退出。我只知道打印“成功”时它已成功完成。目前,只要我看到“成功”或“失败”,我就会SIGINT,然后手动运行下一个程序,如果它是“成功”。

有没有一种更简单的方法来顺序执行p1,p2,p3,p4而人工干预较少?

编辑:目前使用ksh,但我不介意也知道其他的。

+1

功能...什么壳呢? – bishop

+0

目前使用ksh,但我不介意也知道其他的。 – Murdius

回答

0

我也是linux编程的新手,但是我发现了一些可能对您有用的东西。您是否尝试过使用'wait'命令?

this answer上stackexchange:

sleep 1 & 
PID1=$! 
sleep 2 & 
PID2=$! 

wait $PID1 
echo PID1 has ended. 
wait 
echo All background processes have exited. 

我没有测试它自己,但它看起来像你在你的问题中所述的内容。

1

在bash中,你可以通过命令grep寻找'Success',然后依靠grep的结果代码。这个技巧是用花括号将整个表达式包装成一个内联子shell。像这样:

$ cat foo.sh 
#!/bin/bash 
[ 0 -eq $(($RANDOM %2)) ] && echo 'Success' || echo 'Failure' 
exit 0 

$ { ./foo.sh | grep -q 'Success'; } && ls || df 

的部分大括号内({})返回0,如果“成功”是在输出中,否则为1,仿佛foo.sh命令已经如此本身完成。 More details on that technique.

我很久没有使用ksh了,但我怀疑有一个similar construction

0

到目前为止所有的答案都可以正常工作,如果你的程序真的会终止的话。 这里有几个想法,您可以通过文档查看更多细节。

1st - 选项将修改您的程序,使其在打印结果消息后通过返回成功代码而终止。

第二 - 如果不能使用分叉。

写一个主要的地方,你每次想要执行一个程序时都要创建一个fork。

  • 在子进程中使用dup2将进程输出到您选择的文件中。

  • 主要保持检查文件的内容,直到你得到的东西,并与成功或失败进行比较。 - 将文件空白。

  • 然后您可以制作另一个叉并执行下一个程序。
  • 再次重复相同的操作。

请记住,execute是一个命令,它将使用作为参数传递的文件的代码替换其执行的进程的代码,因此首先进行dup2调用。

0

当程序返回成功或失败并继续运行时,只要字符串通过,就应该将其终止。

做出这样

function startp { 
    prog=$1 
    ./${prog} | while read -r line; do 
     case "${line}" in 
     "Success") 
     echo OK 
     mykill $prog 
     exit 0 
     ;; 
     "Fail") 
     echo NOK 
     mykill $prog 
     exit 1 
     ;; 
     *) echo "${line}" 
     ;; 
     esac 
    done 
    exit 2 
} 

功能,您需要添加一个迈基尔功能,看起来对PX项目,并杀死它(xargs的是好的吧)。

呼叫像

startp p1 && startp p2 && startp p3