交互式应用程序:确保每30分钟发现一次输出

所以,由于一些非常糟糕的deviseselect,我坚持在Debian机器上永远运行一个复杂的,不可替代的交互式控制台应用程序。

这个应用程序反复执行一些任务,然后返回stdout结果,如:

 InvetoryOpt: Finished PBridged: Finished FLoot: ERROR 

我需要确保每x分钟我得到stringInvetoryOpt: Finished在程序的输出InvetoryOpt: Finished 。 如果没有,我需要杀死它,运行其他脚本,再次启动程序和检查。

我怎么能做到这一点? 我正在考虑expect但我没有太多的经验,我不知道我能够检查输出是否匹配每x分钟string。

笔记:

  • 该程序还输出很多我不关心的垃圾,
  • 该程序可以输出相同的stringInvetoryOpt: 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