我有几个程序需要以某种顺序运行(p1然后p2然后p3然后p4)。 通常我只会做一个简单的脚本或P1型& & P2 & & P3 & & P4。在Unix中连续运行程序
但是,这些程序不能正确退出。我只知道打印“成功”时它已成功完成。目前,只要我看到“成功”或“失败”,我就会SIGINT,然后手动运行下一个程序,如果它是“成功”。
有没有一种更简单的方法来顺序执行p1,p2,p3,p4而人工干预较少?
编辑:目前使用ksh,但我不介意也知道其他的。
我有几个程序需要以某种顺序运行(p1然后p2然后p3然后p4)。 通常我只会做一个简单的脚本或P1型& & P2 & & P3 & & P4。在Unix中连续运行程序
但是,这些程序不能正确退出。我只知道打印“成功”时它已成功完成。目前,只要我看到“成功”或“失败”,我就会SIGINT,然后手动运行下一个程序,如果它是“成功”。
有没有一种更简单的方法来顺序执行p1,p2,p3,p4而人工干预较少?
编辑:目前使用ksh,但我不介意也知道其他的。
我也是linux编程的新手,但是我发现了一些可能对您有用的东西。您是否尝试过使用'wait'命令?
从this answer上stackexchange:
sleep 1 &
PID1=$!
sleep 2 &
PID2=$!
wait $PID1
echo PID1 has ended.
wait
echo All background processes have exited.
我没有测试它自己,但它看起来像你在你的问题中所述的内容。
在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。
到目前为止所有的答案都可以正常工作,如果你的程序真的会终止的话。 这里有几个想法,您可以通过文档查看更多细节。
1st - 选项将修改您的程序,使其在打印结果消息后通过返回成功代码而终止。
第二 - 如果不能使用分叉。
写一个主要的地方,你每次想要执行一个程序时都要创建一个fork。
在子进程中使用dup2将进程输出到您选择的文件中。
主要保持检查文件的内容,直到你得到的东西,并与成功或失败进行比较。 - 将文件空白。
请记住,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
}
功能,您需要添加一个迈基尔功能,看起来对PX项目,并杀死它(xargs的是好的吧)。
呼叫像
startp p1 && startp p2 && startp p3
功能...什么壳呢? – bishop
目前使用ksh,但我不介意也知道其他的。 – Murdius