Ubuntu12.04でサスペンドモード
Androidから自宅サーバー(ubuntu12.04)にアクセスする で、外からつなげられるようになったので
インターネットから、Ubuntu機をWOLで、動作させられないものかやってみた。
5/12 少し修正
5/14 6時間ごとのEPG更新について検証中
6/24 月をまたぐとatqのソートがうまくいっていなかった件を修正
7/ 9 月またぎを修正すると、録画の起動にたまに失敗するようになった。
ソートをどうすれば良いのか分からないので、放置中
Ubuntu12.04は、不具合があったとかで、ハイバネートは、通常使えない状態になっている。
まずは、ハイバネートの確認
$ cat /sys/power/state
standby mem disk
stanby =スタンバイ
mem =サスペンド
disk =ハイバネート と言うことらしくて、対応している物が表示されるようだ。
ハイパネートがいけそうなので、それ用の設定をしてみる
pm-utilsを使うと、設定がいろいろ楽らしいので、インストールしてみる。
$ sudo apt-get install pm-utils #インストール
ハイバネートが出来るかどうかを手動で確認する
$ sudo su #sudo でコマンド入力しても受け付けないので、一度suになった
# echo `date +%s -d +3min` > /sys/class/rtc/rtc0/wakealarm #3分後に起動させる設定
# cat /proc/driver/rtc
rtc_time : 07:24:44
rtc_date : 2013-05-05
alrm_time : 07:27:09
alrm_date : 2013-05-05 #以下略
alrm_timeがrtc_timeの3分後になっていることを確認
# pm-hibernate #ハイバネート
3分後にハイバネートで起動してきた
電源オンで復旧することを確認 このサーバー機はハイバネートに問題が無いようだ
録画環境の不具合対処
ハイバネートをかけると、録画が正常に出来なくなる不具合がある。
対処方法は、PT3をロードし治せば治るらしい。 最新のドライバだと下記だけで動くそうです。
$ sudo gedit /etc/pm/config.d/pt3
SUSPEND_MODULES=”pt3_drv” #1行記述
これで、先ほどの通り、手動でハイバネート後、録画してみると、今度は録画に成功した。
5/12 修正 どうも、時間のズレがあって、ハイバネート後の録画が数分間に合わないので、
再起動すると強制的に時間の修正をするらしいので、復帰を早くして再起動させてみた。
$ sudo gedit /usr/lib/pm-utils/sleep.d/75modules
resume_modules()
{
modreload
echo “Reloaded unloaded modules.”
sleep 30
/sbin/shutdown -r now
}
30秒待って、再起動
続いて、自動でハイバネートが出来るように設定
ネオジェネシスふれんどり さんとか 事象の水平線 さんを参考にして、自分の仕様に変更した。
$ sudo gedit /usr/local/bin/autosuspend.sh
#!/bin/sh
# log setting
log=”/var/log/autosuspend.log”
loglength=”1000″
# 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
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,50500 | grep ESTABLISHED`
##### log #####
echo “who,1 :”$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,mdiatomb (port22,80,5901,50500 isn’t ESTABLISHED).
if [ -z “$lsofESTAB” ]; then
# get nearest time which at scheduled.
nearest=`atq|awk ‘{print $6,$3,$4,$5}’|\
sort -n -k 4|sort -k 1 -Mk 2 -k 3|\
head -1|awk ‘{print $2,$3,$4,$1}’`
# transform timestamp to seconds.
wkuptime=`date -d “$nearest” +%s`
# set secs to 10 minutes before.
wkuptime=`expr $wkuptime – 600`
##### log #####
echo “atq.time :”`date –date “@$wkuptime”` >> $log
# Acquisition of the acquisition time of a program table.
h=`date +%H`
m=`date +%M`
if
test 00 -eq $h -a 27 -ge $m;
then
time=00:27:00
elif
test 05 -ge $h;
then
time=06:27:00
elif
test 06 -eq $h -a 27 -ge $m;
then
time=06:27:00
elif
test 11 -ge $h;
then
time=12:27:00
elif
test 12 -eq $h -a 27 -ge $m;
then
time=12:27:00
elif
test 17 -ge $h;
then
time=18:27:00
elif
test 18 -eq $h -a 27 -ge $m;
then
time=18:27:00
else
time=00:27:00
fi
# get present time.
now=`date`
# getepgtime is scheduled for 29min
if
test 19 -le $h;
then
getepgtime=`expr $(date -d “$now 1day” +%Y-%m-%d)” 00:27:00″`
elif
test 18 -eq $h -a 27 -gt $m;
then
getepgtime=`expr $(date -d “$now 1day” +%Y-%m-%d)” 00:27:00″`
else
getepgtime=`expr $(date +%Y-%m-%d)” $time”`
fi
# 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
# return /proc/driver/rtc
cat /proc/driver/rtc
# hardwerclock
sudo hwclock -w
# hibernate
sudo pm-hibernate
fi
fi
fi
fi
fi
fi
最後に、
# crontab -e
*/20 * * * * /usr/local/bin/autosuspend.sh
で、cronで20分ごとに回して様子を見てみることにする。
10分前に起動して、再起動して録画するようになった。
5/14 更に修正してみた
18時間後位の起動で、相当時間がずれていたので
番組更新のために6時間おきの設定とハイバネート前のBIOS時間の修正を追加してみた。
とりあえず、まともに動くのかを検証しつつ、時間のズレを見てみようと思う。
「Ubuntu12.04でサスペンドモード」への2件のフィードバック
今晩はです。
私も真似っ子なのですが・・・
サスペンスモードは使っていません。
shutdown を使っています。
私の使っているsortの部分です。
nearest=`atq|awk ‘{print $6,$3,$4,$5}’|sort -k1n,1 -Mk2r,2 -k3n,3 -k4n,4|head -1|awk ‘{print $2,$3,$4,$1}’`
こんばんは。 ブログ作者のRです。
コメントありがとうございます。
長期出張中で自宅のPCにさわる暇がないので、
時間のあるときに試してみたいと思います。