因此,由于一些非常糟糕的设计选择,我只能运行一个复杂且不可替代的交互式控制台应用程序永远在 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