在Unix中顺序运行程序

时间:2015-05-20 15:42:12

标签: unix ksh

我有几个需要按特定顺序运行的程序(p1然后是p2,然后是p3,然后是p4)。 通常我会简单地制作一个简单的脚本或输入p1&& p2&& p3&& P4。

但是,这些程序无法正确退出。我只知道它成功完成了"成功"打印出来。目前,I SIGINT一旦我看到"成功"或"失败"然后手动运行下一个程序,如果它是"成功"。

是否有更简单的方法可以用较少的人为干预顺序执行p1,p2,p3,p4?

编辑:目前正在使用ksh,但我也不介意了解其他的。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

来自stackexchange上的this answer

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

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

我自己没有测试过,但它看起来就像你在问题中描述的那样。

答案 2 :(得分:0)

如果您的程序实际终止,到目前为止所有答案都可以正常工作。 您可以通过文档了解更多详细信息。

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

第二 - 如果不可能使用叉子。

每当你想要执行一个程序时,写一个main来制作一个fork。

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

  • 在主要部分中继续检查所述文件的内容,直到获得某些内容并将其与成功或失败进行比较。 -empty文件。

  • 然后你可以创建另一个fork并执行下一个程序。
  • 再次重复相同的操作。

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

答案 3 :(得分:0)

当你的程序返回Success或Fail并继续运行时,你应该在字符串通过后立即将其终止。

制作类似

的功能
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
}

你需要添加一个mykill函数来查找px程序并将其杀死(xargs很适合它)。

调用函数

startp p1 && startp p2 && startp p3