交互式应用程序:确保每 30 分钟找到特定的输出

交互式应用程序:确保每 30 分钟找到特定的输出

因此,由于一些非常糟糕的设计选择,我只能运行一个复杂且不可替代的交互式控制台应用程序永远在 Debian 机器上。

该应用程序重复执行一些任务并返回stdout如下结果:

InvetoryOpt: Finished
PBridged: Finished
FLoot: ERROR

我需要确保每隔 x 分钟就能InvetoryOpt: Finished从程序的输出中获取字符串。如果没有,我需要终止它,运行其他脚本,重新启动程序并进行检查。

我该如何实现这个?我正在考虑,expect但我没有太多经验,而且我不确定我是否能够每 x 分钟检查一次输出是否匹配字符串。

笔记:

  • 该程序还输出大量我不关心的其他垃圾;
  • 该程序可以在 30 分钟内多次输出相同的字符串InvetoryOpt: Finished,或者根本不输出任何内容。因此,尾随文件末尾不会产生此效果,因为它会匹配该字符串的最后一次输出。

谢谢。

答案1

您可以使用下面的脚本作为包装器控制器。我假设 bash 是已知的,所以没有技术评论。如果您需要,我可以添加它们。

您提到的脚本的变量 PROGRAM 和 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

相关内容