我在这个项目上工作,一旦进入公寓,就会播放音乐。我有一组USB扬声器连接到我的路由器USB端口。我使用OpenWRT通过我的路由器流式传输Radio。 现在我想尝试将ping请求用于分配给我的手机的静态IP。 想法:
电话在家 - > ping请求肯定 - > bash激活MPD播放音乐 电话不在家 - > ping请求超时 - > MPD停止播放
我的脚本问题是Iphone在一段时间后与WLAN断开连接。当我再次使用手机时,Wifi激活,音乐又开始播放,非常烦人:)
现在我想找到一种方法让脚本只在没有连续4个小时检测到电话的情况下才会激活。 这是我的剧本:
ping 192.168.1.233 -c 1 -W 5 > /tmp/devicelist
status=$(grep -i -c '1 packets received' /tmp/devicelist)
prevStatus=$(cat /tmp/ishome)
if [ $status = $prevStatus ]; then
echo "No change"
else
if [ $status = "1" ]; then
echo "Phone detected"
mpc load bondi && mpc play 1
else
echo "Phone lost"
mpc stop
fi
fi
echo $status > /tmp/ishome
echo $status | while IFS= read -r line; do echo "$(date) $line"; done >> /tmp/ishome.log
最后一行是为了调试目的。该脚本每5分钟作为一个cron作业运行 我可以使用ishome.log这是一堆0作为输入吗? 让我们说我希望脚本仅在ishome.log有10x0时才执行?
答案 0 :(得分:1)
例如,您可以计算最后10行中的零个数:
if [ "$(tail -n10 ishome.log | sort | uniq -c)" = " 10 0" ]; then echo 10 times 0; fi
只有满足该条件并且$status
变为1才能播放音乐。
答案 1 :(得分:0)
谢谢你们,它现在正在工作,我想发布我的最终剧本
NOW=$(date +"%s")
dayBegin=$(date --date="07:00" +"%s")
dayEnd=$(date --date="22:00" +"%s")
if [ ${NOW} -gt ${dayBegin} ] && [ ${NOW} -lt ${dayEnd} ]; then
ping 192.168.1.233 -c 1 -W 5 > /tmp/devicelist
status=$(grep -i -c '1 packets received' /tmp/devicelist)
if [ $status = "1" ]; then
echo "Phone detected"
if [ "$(tail -n60 /tmp/ishome.log | sort | uniq -c)" = " 60 0" ]; then
mpc clear && mpc load all && mpc play 1
fi
else
echo "Phone lost"
mpc stop
fi
fi
echo $status | while IFS= read -r line; do echo "$line"; done >> /tmp/ishome.log
cron标签:
* * * * * ~/musicphone.sh
* 2 * * * ~/logshorten.sh
因此,每分钟检查脚本可能看起来有点矫枉过正,但是当我回家时,音乐开始播放而不是5分钟后。我还有一个小脚本每天将日志缩短到500行
for file in /tmp/ishome.log; do
tail -500 "$file" > "$file.tmp"
mv -- "$file.tmp" "$file"
done
我确信有更聪明的方法可以解决这个问题,但这对我有用!