統計情報から、トラックバックしていただいていたことに気付いたので、現状どうなっているかをちょろっと書く。
遭遇した問題と対策
- 連ドラとか短い番組ばかり撮って直ぐシャットダウンしているとEPG情報が枯渇する
→ 最低30分はシャットダウンしない - rasPIのKodi(XBMC)で録画を観るため、rasPIが動いている時間は落ちられると困る
→ rasPIのsystemdからchinachuサーバにsshログインし、chinachuサーバ側でSSHセッションを監視、セッションがある間は落とさない - ハイバーネートだとPT2やBCASリーダーが起動後に動かないときがある
→ PT2はモジュールのアンロードとロードで解消できたがBCASの方はなお不安定だったので、毎度シャットダウンするようにした。それによりchinachuサービスが先に死ぬようになりREST APIが使えず、jsonファイルを直参照して次回起動を変更するよう変更。
コード
gist良いなぁ。今回はブログ上に掲載。
root ~# crontab -l
# 起動後と3時間おきににlogwatchのレポートをメールする @reboot /usr/sbin/logwatch --mailto haruo31@underthetree.jp 15 */3 * * * /usr/sbin/logwatch --mailto haruo31@underthetree.com # upから30分以上経ち、かつchinachuが録画をしておらず、sshセッションがないとき # メール送信し10秒後にshutdown -h */5 * * * * /usr/local/bin/up30min && /usr/local/bin/chinachuFree && /usr/local/bin/loginFree && ~root/shutmail.sh && sleep 10 && /sbin/shutdown -h now # shutdown -r 10 せず敢えてsleepしているのはshutdown中であることで # 何か制限があった気がしたから(ソースなし)
root ~# cat /usr/local/bin/up30min
#!/bin/sh UTIME=`uptime -s` BASE=`date -d"$UTIME" +%s` EXP=`date -d-30min +%s` [ "$BASE" -lt "$EXP" ] exit $?
root ~# cat /usr/local/bin/chinachuFree
#!/usr/bin/env python3 # -*- charset: utf8 -*- import sys from ChinachuStatus import ChinachuStatus if __name__ == '__main__': url = 'http://localhost:10772/api' res = ChinachuStatus(url).isChinachuBusy() if res: print("Chinachu is busy now.") sys.exit(1) print("Chinachu is free.") sys.exit(0)
root ~# cat /usr/local/bin/ChinachuStatus.py
#!/usr/bin/env python3 # -*- charset: utf8 -*- from urllib.request import urlopen import json import io import time class ChinachuStatus: def __init__(self, urlBase): self.urlBase = urlBase def getNextReserve(self): response = urlopen(self.urlBase + '/reserves.json') res = json.load(io.TextIOWrapper(response, response.getheader('content-type').split('charset=')[1])) now = time.time() for e in [ int(ent['start'] / 1000) for ent in res if ent['start'] / 1000 > now ]: return e def isChinachuBusy(self): response = urlopen(self.urlBase + '/recording.json') res = json.load(io.TextIOWrapper(response, response.getheader('content-type').split('charset=')[1])) return len(res) > 0 or self.getNextReserve() - 600 < time.time() if __name__ == '__main__': url = 'http://localhost:10772/api' print(ChinachuStatus(url).getNextReserve()) print(ChinachuStatus(url).isChinachuBusy())
root ~# cat /usr/local/bin/loginFree
#!/bin/sh if who -u | grep . > /dev/null; then exit 1 fi exit 0
root ~# cat /usr/local/bin/chinachuNext
#!/usr/bin/env python3 # -*- charset: utf8 -*- from ChinachuStatus import ChinachuStatus if __name__ == '__main__': url = 'http://localhost:10772/api' # 5分前に起動 print(ChinachuStatus(url).getNextReserve() - 300)
root ~# cat /etc/init.d/chinachu-nextsched # /etc/rc6.d/K06chinachu-nextsched にリンクを張るのが多分正解
#!/bin/sh # Action script ensure that unattended-upgrades is finished # before a hibernate PATH=/sbin:/usr/sbin:/bin:/usr/bin SHUTDOWN_HELPER=/usr/share/unattended-upgrades/unattended-upgrade-shutdown echo 0 > /sys/class/rtc/rtc0/wakealarm /bin/rm /home/chinachu/chinachu/data/*.lock’ /usr/local/bin/chinachuNext.old > /sys/class/rtc/rtc0/wakealarm echo Wakeup schedule has been set successfully.
root ~# cat /usr/local/bin/chinachuNext.old
#!/usr/bin/env python3 # -*- charset: utf8 -*- from urllib.request import urlopen import json import io import time class Reserves: def __init__(self, url): with open(url, mode='r', encoding='utf8') as f: self.o = json.load(f) def getNextTime(self): now = time.time() for e in [ int(ent['start'] / 1000) for ent in self.o if ent['start'] / 1000 > now ]: return e if __name__ == '__main__': url = '/home/chinachu/chinachu/data/reserves.json' print(Reserves(url).getNextTime() - 300)
コメントを残す