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分後にハイバネートで起動してきた

電源オンで復旧することを確認 このサーバー機はハイバネートに問題が無いようだ

 

LAN内で実験

Fing – Network Tools を使用すると、自動でLAN内の情報を取得するので、

サーバー機を選択して、Wake on LAN を選択すると、スマホで起動させることが出来た。

インターネット上から

Wake On Lan を使用してみた。

IPアドレスは、VPN設定でスマホに設定してあるサーバーアドレスと同じ物を入れる。

ルータの設定画面(NTT RV-S340NEの場合)

「詳細設定」→「高度な設定」→「WAN→LAN中継」を出して、チェックを入れる。

接続先は、インターネット

UDPポート番号は、好きなポートに変更

すると、ハイバネートで起動できた。

 

録画環境の不具合対処

ハイバネートをかけると、録画が正常に出来なくなる不具合がある。

対処方法は、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時間の修正を追加してみた。

とりあえず、まともに動くのかを検証しつつ、時間のズレを見てみようと思う。

2 Comments

  1. sam 10月 29, 2013 10:32 pm  返信

    今晩はです。
    私も真似っ子なのですが・・・
    サスペンスモードは使っていません。
    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}’`

  2. 10月 29, 2013 10:50 pm  返信

    こんばんは。 ブログ作者のRです。
    コメントありがとうございます。
    長期出張中で自宅のPCにさわる暇がないので、
    時間のあるときに試してみたいと思います。

Leave a comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


 

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)