所以,由于一些非常糟糕的deviseselect,我坚持在Debian机器上永远运行一个复杂的,不可替代的交互式控制台应用程序。
这个应用程序反复执行一些任务,然后返回stdout结果,如:
InvetoryOpt: Finished PBridged: Finished FLoot: ERROR
我需要确保每x分钟我得到stringInvetoryOpt: Finished在程序的输出InvetoryOpt: Finished 。 如果没有,我需要杀死它,运行其他脚本,再次启动程序和检查。
我怎么能做到这一点? 我正在考虑expect但我没有太多的经验,我不知道我能够检查输出是否匹配每x分钟string。
笔记:
InvetoryOpt: Finished在30分钟内InvetoryOpt: Finished多次或根本不输出任何东西。 所以拖尾文件将不会执行它,因为它将匹配该string的最后一个输出。 谢谢。
您可以使用下面的脚本作为包装控制器。 我认为bash是已知的,所以没有技术评论。 我可以添加他们,如果你想要他们。
您提到的脚本的variablesPROGRAM和OTHER_SCRIPT需要定义。
时间控制是刚性的,即。 它不会重置倒数到最后的InvetoryOpt: Finished消息时间,只是每30分钟检查一次。 如果你需要的话,我可以想办法改善这一点。
更新:添加陷阱。
#!/usr/bin/env bash trap ' kill %1 rm $OUT exit ' 2 #provide the program command below PROGRAM= #provide the other script below OTHER_SCRIPT= PHRASE="InvetoryOpt: Finished" INTERVAL=1800 OUT=/tmp/out$$ message () { echo "$(basename "$0")": "$1" } start_app () { eval "$PROGRAM | tee $OUT &" } action () { if ! grep -q -e "$PHRASE" $OUT then message "Check failed. Restarting." >&2 kill %1 eval "$OTHER_SCRIPT" start_app else message "All fine." fi > $OUT } start_app while true do { sleep $INTERVAL action } done