はじめに
Chinachu環境で待機時間はシャットダウンさせる方法です。Ubuntu 14.04の一般ユーザー(この場合tvユーザー)でテストしています。
謝辞
これを作るにあたって録画サーバー向けスクリプトと設定 · GitHubを大いに参考にさせていただきました。おもな変更点は次の通りです。
- 次の録画時間から起動にかかる時間を減ずる処理をchinachuNextからautoshutdownに移した。
- autoshutdown
- 次の録画時間まで6分あればシャットダウン(35分→6分)。
- 次の録画時間の3分前に起動(5分→3分)。
- 録画中、Sambaファイルロック中、SSH接続中のほかに、SMPlayer起動中もシャットダウンしなくした。
- SSH接続判定において、デスクトップ環境でログオンしていてもシャットダウンするようにした(ptsで絞り込み)。
- 環境をbashに決め打ちした。
- ネストをなくした。
- ログ出力機能を追加した。
- chinachuNextを同じディレクトリから読むようにした。
- 次回起動時間の設定にrtcwakeを使用した。
- chinachuNext
- IPアドレスを決め打ちしなくてもすむように、localhostを参照するようにした。
準備
- Chinachuの設定でWUIの認証をなくす。
- sudoのパスワードを不要にする。
- http://localhost:10772/api/reserves.json にアクセスできることを確認する。
シャットダウン・起動テスト
これを実行して3分後に起動することを確認します。
NOW=$(date +%s) &&
WAKEUPTIME=$(($NOW + 180)) &&
echo "NOW: $NOW $(date --date @$NOW --iso-8601=seconds)" &&
echo "WAKEUPTIME: $WAKEUPTIME $(date --date @$WAKEUPTIME --iso-8601=seconds)" &&
sudo rtcwake -m off -t $WAKEUPTIME
ディレクトリ構成
- home
- tv
- cron
- autoshutdown #本体
- chinachuNext #次の録画時間を返す(要Python3)
- crontab #cronの設定ファイル
- cron
- tv
autoshutdown
- 次の録画時間までが6分(360秒)より長ければシャットダウン。
- 録画時間の3分前(180秒)に起動。
- chinachuNextはスクリプトと同じディレクトリに配置。
- LOG=trueでスクリプトと同じディレクトリにログを出力。
- デスクトップ環境を前提に、SMPlayerを起動しているときはシャットダウンしない。
#!/bin/bash
LOG=true # LOG=true LOG=false
REALPATH=$(cd $(dirname $0) && pwd)
# -lt < -le <= -eq = -ne !=
[ 1 -lt $(ps aux | grep 'recpt1' | wc -l) ] && exit
[ 0 -lt $(sudo smbstatus -L | grep -E ' (EXCLUSIVE\+BATCH|EXCLUSIVE|BATCH|LEVEL_II) ' | wc -l) ] && exit
[ 1 -lt $(ps aux | grep 'smplayer' | wc -l) ] && exit
[ 1 -lt $(ps aux | grep '/usr/bin/mpv' | wc -l) ] && exit
[ 0 -lt $(who | grep ' pts/' | wc -l) ] && exit
NOW=$(date +%s)
NEXTTIME=$(python3 "$REALPATH/chinachuNext")
WAKEUPTIME=$(($NEXTTIME - 180))
INTERVAL=$(($NEXTTIME - $NOW))
[ $INTERVAL -lt 360 ] && exit
$LOG && echo "$(date --iso-8601=seconds) shutdown WAKEUPTIME: $(date --date @$WAKEUPTIME --iso-8601=seconds)" >> $REALPATH/autoshutdown.log
sudo rtcwake -m off -t $WAKEUPTIME
2016年9月10日、いろいろ修正しました。旧バージョンだとシャットダウンしなかったかも…。
chinachuNext
#!/usr/bin/env python3
from urllib.request import urlopen
import json
import io
import time
class Reserves:
def __init__(self, url):
response = urlopen(url)
self.o = json.load(io.TextIOWrapper(response, response.getheader('content-type').split('charset=')[1]))
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 = 'http://localhost:10772/api/reserves.json'
print(Reserves(url).getNextTime())
crontab
10分に一回、autoshutdownを実行します。
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow command
*/10 * * * * ~/cron/autoshutdown
crontabを反映
crontab ~/cron/crontab
テスト実行
chmod 700 ~/cron/chinachuNext && chmod 700 ~/cron/autoshutdown && ~/cron/autoshutdown