我有几个需要按特定顺序运行的程序(p1然后是p2,然后是p3,然后是p4)。 通常我会简单地制作一个简单的脚本或输入p1&& p2&& p3&& P4。
但是,这些程序无法正确退出。我只知道它成功完成了"成功"打印出来。目前,I SIGINT一旦我看到"成功"或"失败"然后手动运行下一个程序,如果它是"成功"。
是否有更简单的方法可以用较少的人为干预顺序执行p1,p2,p3,p4?
编辑:目前正在使用ksh,但我也不介意了解其他的。
答案 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文件。
请记住,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