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