事象の水平線

個人的ブックマーク代わりなメモ書きブログ。 地球は丸いよ。↓このへん。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop
CentOS6.0の時も同じ様なことをしたのだけれど、ちょっと調べたらいいのがあったので参考にというか、頂いちゃいました。

参考
『ネオジェネシスふれんどり』さんの『地デジ録画サーバ(epgrec)自動起動・終了設定できたお

基本的には同じですが、多少手を入れてます。 無駄に長くなったようですが・・・

[root@NAS ~]# vi /usr/local/bin/autosuspend.sh
#!/bin/sh

# log setting
log="/var/log/autosuspend.log"
loglength="20000"

# sort works well when LANG=C
LANG=C

# if log line is ovar loglength
if [ `wc -l < $log` -gt $loglength ]; then
# cut start 10 lines
filelength=`wc -l < $log`
length=`expr $filelength - 10`
tail -n $length < $log > /dev/shm/autosuspendlogtmp
cat /dev/shm/autosuspendlogtmp > $log
rm -f /dev/shm/autosuspendlogtmp
fi

# putout a date in log
echo "====== autosuspend.sh "`date`" ======" >> $log

lsofVNC=`sudo lsof -i :5901`
echo "VNC_LISTEN:"`echo "$lsofVNC" | grep LISTEN` >> $log
echo "VNC_ESTAB.:"`echo "$lsofVNC" | grep ESTABLISHED` >> $log
# if vnc server live ,but vnc client doesn't log in.
if [ `expr "$lsofVNC" : '.*LISTEN'` -gt 0 -a `expr "$lsofVNC" : '.*ESTABLISHED'` -eq 0 ]; then
# kill vncserver
sudo vncserver -kill :1
sleep 10
echo "(vncserver was killed)" >> $log
fi

whoislogged=`who | wc -l`
usingsamba=`smbstatus -L | wc -l`
runningjob=`atq | grep = | wc -l`
recpt1=`ps -el | grep recpt1`
lsofESTAB=`sudo lsof -i :22,80,5901,8200 | grep ESTABLISHED`
##### log #####
echo "who,0 :"$whoislogged >> $log
echo "smb,2 :"$usingsamba >> $log
echo "atq,0 :"$runningjob >> $log
echo "recpt1:"$recpt1 >> $log
echo "lsof ESTABLISHED:"$lsofESTAB >> $log

# if nobody logged in.
if [ 0 -eq "$whoislogged" ] ; then
# if nobody are using samba.
if [ 2 -eq "$usingsamba" ]; then
# if no at jobs are runnning.
if [ 0 -eq "$runningjob" ]; then
# if recpt1 is not runnning.
if [ -z "$recpt1" ]; then
# if no user on ssh,www,vnc,dlna (port22,80,5901,8200 isn't ESTABLISHED).
if [ -z "$lsofESTAB" ]; then

# get nearest time which at scheduled.
nearest=`atq | awk '{print $2,$3}' |\
sort -n | head -1 | awk '{print $1,$2}'`
# transform timestamp to seconds.
wkuptime=`date -d "$nearest" +%s`
# set secs to 3 minutes before.
wkuptime=`expr $wkuptime - 180`
##### log #####
echo "atq.time :"`date --date "@$wkuptime"` >> $log

# get present time.
now=`date`

# getepgtime is scheduled for 29min at midnight.
getepgtime=`expr $(date -d "$now 1day" +%Y-%m-%d)" 00:27:00"`
# getepgtime in sec.
getepgtime=`date -d "$getepgtime" +%s`
# if getepgtime will start before next atq.
if [ $wkuptime -gt $getepgtime ]; then
# set wkuptime at getepgtime.
wkuptime=$getepgtime
fi
##### log #####
echo "wkup.time :"`date --date "@$wkuptime"` >> $log

# present time in sec.
now=`date -d "$now" +%s`
# if there is more than 30 minutes to get up the next time.
if [ `expr $wkuptime - $now` -gt 1800 ]; then
# initialize wakealarm.
echo 0 > /sys/class/rtc/rtc0/wakealarm
# set wakealarm.
echo $wkuptime > /sys/class/rtc/rtc0/wakealarm
##### log #####
cat /proc/driver/rtc >> $log
# suspend
sudo pm-suspend --quirk-dpms-on
fi
fi
fi
fi
fi
fi

『ネオジェネシスふれんどり』さんみたく見易く色分けしたらいいんでしょうけど、手作業になっちゃうんですみません・・・

えーと。$logは実際に思ったとおりの動作をしてるかを知るために、吐かせてます。
当初は仮で入れてたんですが結構色々なところでハマッタので、入れとくことにしました。
で、2万行超えたら頭の10行を捨てるような処理をしてます。いいやり方かはわかりませんが・・・ logrotateとかしらんす。そっちの方が楽なんでしょうけど・・・・
あ、それと、cat /proc/driver/rtcで出てくる時間はJSTじゃないので+9時間して読んでください。
(ロケールで変わるのかも・・・)

自動終了する流れとしては
1:whoが0行ターミナルでログインしているユーザーがいない
2:smbstatusでロックされたファイル一覧が2行サンバでファイルロックをしている人がいない
3:atqで『=』の付いた行がないatのjobが走っていない(録画中ではない)
4:文字列『recpt1』が含まれたプロセスが走っていない録画中orEPG更新中ではない
5:22、80、5901、8200のポートが使われてないssh、www、vnc、minidlnaで使ってるユーザーがいない
1~5で使っている人がいない場合、次回の録画予約を調べて、それと夜中の0:29(epgの更新時間)のどちらか早いほうが現在の時間より30分以上あいてるなら、サスペンドする。
という感じです。

『ネオジェネシスふれんどり』さんはの録画中判定をatq=があるか(3)だけで判定してますが、環境の違い(Debian系とRedHat系の違いですかね)のせいか、うちではだめだったのでpsも追加しました。
atqを調べると確かにmanページに「The special queue "=" is reserved for jobs which are currently running.」と書いてあるんですが、何故かうちの環境ではjobが走っているにもかかわらず、録画開始から1時間くらいたつと=が消えてしまってうまくいかなかったです。
最初は2時間番組が途中までしか録画されないのでEPGRECか、ハードウェアの問題か、HDDのスピンダウンの設定か、と色々疑ったのですが、実際の録画中にターミナルでatqを打っていたら急に消えたにもかかわらず、win機から見てるサンバのフォルダでファイルの容量が増えていくのでこれだとわかりました。

また、『ネオジェネシスふれんどり』さんはsortするのにatqの結果がdateコマンドの結果に近いものを想定しているっぽいけど、うちの環境では、
[root@NAS ~]# atq
38 2012-10-03 20:57 a apache

こんな感じなので、単にsort -nで大丈夫でした。
参考:ソートの分かりやすい解説→『あらびき日記』さんの『sortコマンドで複数キーによるソート

頭のほうのvncserver -kill :1してる部分はUltraVNCを使った後、killを忘れて、UltraVNC上でターミナルを開いたままUltraVNCのウィンドウを閉じてしまうので、そうなると、whoで常に誰かつながっていることになって、終われないのでvncサーバーが立ち上がってるにもかかわらず、クライアントがEstablishしてない場合サーバーをkillするというものです。
sleep10はたんにkillの時間を待ってるだけです。(killされたか判定が面倒だっただけ)

シャットダウンでもうまくいったけど、サスペンドの方がNASとして使うには理想的なので、サスペンドにしました。
SSDではないためか、CentOSだからか、DN2800MTだからか、復帰には20秒弱かかるけど、まぁ仕方ないか・・・・(サスペンドだからSSDは関係ないか・・・)

で、クロン登録 20分毎(0分、20分、40分)に実行。
最低気温が10度を下回るような寒い11月~4月はHDDを24時間動かしていたほうがいいのではないかということで、5月~10月のみ実行。
消費電力が約20wなので、30日でも約320円(22円/1kwh換算)なので、まぁ、保険料ということで・・・

[root@NAS ~]# crontab -e
*/20 * * 5-10 * /usr/local/bin/autosuspend.sh


それと、lsof,vncserver,pm-suspend ではsudoが必要なので
visudoで「Defaults requiretty」をコメントアウトです。

HP上からphpでサスペンドできるようにしようかとも思って途中まで作ったけど、port80が判定できなくなるし、まぁいっか。と思ってやめました。

『ネオジェネシスふれんどり』さんも書いてますけど、BIOSのRTC Timerとか使うのかと思ってたのにACPIすごいす。


<<追記>>
サスペンドにしてるから次の起動までの間に電源断があると、以前、起動時にメモリに読み込んだ情報が消えて次の予約時間が到達しても起動できずに予約録画が失敗するんだろうな、と思っていた。
ところが、電源を数秒抜いて停電を試してみたら、次の予約時間にはきちんとブートして予約録画が実行されていた。
当然メモリの内容は消えて起動しなおしてるようでuptimeは再度カウントを始めていた。
スクリプト的に自動でサスペンドへ移行したときは、誰もログインしていない状態=メモリが消えても特に作業内容が消えない状態なので、(vnc上で何かしててvncクライアントを終了した場合はvncのリモート上での作業状態はもともとスクリプトでkillされるが)メモリがクリアされて一からブートがかかっても何も問題はない。
ということで、この運用状態だと、シャットダウンやハイバネートを使う必要すらなくサスペンドで完璧に希望の動作が行われることがわかった。しかも、サスペンド状態の消費電力をワットチェッカーでみても0W(小数点以下測定不能)なので、ほとんど電気も食われていない。ほんとACPIすごいわ~~どうなってんの?
スポンサーサイト

PageTop

コメント

 ※
 ※
管理者にだけ表示を許可する
  ※ 必須項目です

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。