我正在尝试编写一个小的bash脚本来监视RiotShield(英雄联盟的第三方玩家刮刀)的输出。如果在日志中找到关键字,它应该终止进程并重新启动它。
这是我的bash脚本:
#!/bin/bash
crash[1]="disconnected"
crash[2]="38290209"
while true; do
list=$(tail log.log)
#clear
echo "Reading Log"
echo "========================================"
echo $list
for item in ${list//\\n/ }
do
for index in 1 2
do
c=${crash[index]}
#echo "Crash Word:" $c
if [[ "$c" == *"$item"* ]]; then
echo "RiotShield has crashed."
echo "Killing RiotShield."
kill $(ps aux | grep '[R]iotShield.exe' | awk '{print $2}')
echo "RiotShield killed!"
echo "Clearing log."
echo > log.log
echo "Starting RiotShield"
(mono RiotShield.exe >> log.log &)
fi
done
done
sleep 10
done
我的崩溃数组是我知道在崩溃时显示在日志中的关键字。我在那里只有38290209用于测试目的,因为它是我的英雄联盟上的召唤者ID,并且当我预先搜索我的召唤师名称时,ID显示在日志中。
问题是即使断开连接并且38290209没有显示在我的
日志中if [[ "$c" == *"$item"* ]]; then
火灾,杀死RiotShield进程,然后重新启动它。
崩溃数组的长度会随着我找到更多关于崩溃的关键字而增长,所以我不能这样做
if [[ "$c" == "*disconnected*" ]]; then
请和谢谢SOF
编辑:
添加工作代码:
#!/bin/bash
crash[1]="disconnected"
crash[2]="error"
while true; do
list=$(tail log.log)
clear
echo "Reading Log"
echo "========================================"
echo $list
for index in 1 2
do
c=${crash[index]}
#echo "Crash Word:" $c
if [[ $list == *$c* ]]; then
echo "RiotShield has crashed."
echo "Crash Flag: " $c
echo "Killing RiotShield."
kill $(ps aux | grep '[R]iotShield.exe' | awk '{print $2}')
echo "RiotShield killed!"
echo "Clearing log."
echo > log.log
echo "Starting RiotShield"
(mono RiotShield.exe >> log.log &)
fi
done
sleep 10
done
答案 0 :(得分:4)
我认为你的表达中的操作数是错误的。它应该是:
if [[ $item == *$c* ]]; then
因为您想查看行($c
)中是否存在关键字($item
)。
此外,我不确定为什么你需要通过这样做来突破这一行:${list//\\n/ }
。你可以匹配整条线。
另请注意,[[
中不需要双引号。