在Unix中按顺序运行程序

在Unix中按顺序运行程序,unix,ksh,Unix,Ksh,我有几个程序需要按特定顺序运行(p1、p2、p3、p4)。 通常我只需要编写一个简单的脚本或键入p1&&p2&&p3&&p4 但是,这些程序无法正确退出。我只知道当“成功”被打印出来时它才成功完成。目前,我会在看到“成功”或“失败”后单击SIGINT,然后手动运行下一个程序(如果是“成功”) 是否有一种更简单的方法可以在较少人工干预的情况下顺序执行p1、p2、p3、p4 编辑:目前正在使用ksh,但我也不介意了解其他的。我对linux编程也不熟悉,但我发现了一些可能对您有帮助的东西。您是否尝试过

我有几个程序需要按特定顺序运行(p1、p2、p3、p4)。 通常我只需要编写一个简单的脚本或键入p1&&p2&&p3&&p4

但是,这些程序无法正确退出。我只知道当“成功”被打印出来时它才成功完成。目前,我会在看到“成功”或“失败”后单击SIGINT,然后手动运行下一个程序(如果是“成功”)

是否有一种更简单的方法可以在较少人工干预的情况下顺序执行p1、p2、p3、p4


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

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

在stackexchange上:

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

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

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

在bash中,您可以通过管道将命令传递给grep,以查找“成功”,然后依赖grep的结果代码。实现这一点的诀窍是将整个表达式用大括号括起来,以获得内联子shell。像这样:

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

$ { ./foo.sh | grep -q 'Success'; } && ls || df
如果输出中有“Success”,则花括号(
{}
)内的部分返回0,否则返回1,就像foo.sh命令本身返回一样


我已经很久没有使用ksh了,但我怀疑有一个问题。

如果您的程序真的终止,那么到目前为止所有的答案都会很好。 以下是一些想法,您可以使用浏览文档了解更多详细信息

第一个选项是通过返回成功代码修改程序,使其在打印结果消息后终止

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

编写一个main,每当您想要执行一个程序时,在其中生成一个fork

  • 在子进程中,使用dup2将进程的输出保存在您选择的文件中

  • 总的来说,不断检查所述文件的内容,直到你得到一些东西,并将其与成功或失败进行比较。 -清空文件

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

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

当程序返回成功或失败并继续运行时,应在字符串通过后立即将其终止

使函数像

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
}
startp p1 && startp p2 && startp p3
您需要添加一个mykill函数来查找px程序并杀死它(xargs很适合)

调用如下函数

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
}
startp p1 && startp p2 && startp p3

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