epgrecで自動PC起動を実現する。

結構あっさりできた。

前回までで、自動起動自体の仕組みは完成してたので、あとは、

  • 次の直近の予約ジョブを割り出す。
  • いいタイミングで次回起動時間を設定して、シャットダウンする。

の2点が残課題。

直近の予約ジョブは、atq出力を全部UNIXタイムスタンプに変換して、一番小さい値を入れる。
→なんか、他にいい方法はないものか...

この辺の処理は、勉強もかねて、pythonでやってみたよ。とはいえ、os.system使いまくりのベタコードですが、ま、epgrecがlinuxしか対応してないし、いい事にしよう。

import subprocess
import datetime

# 次のatジョブ時間を取得.
def get_next_attime():
    jobtime = 0
    atq_cmd = ('sudo atq | grep \' a \' | sed \'s/^[^\\t]*\\t//g\' | sed \'s/^\\(.\\{24\\}\\).*$/\\1/\'')
    p = subprocess.Popen(   args=atq_cmd, shell=True, close_fds=True,
                            stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    (stdout, stdin) = (p.stdout, p.stdin)
   
    for i in stdout:
        dtime = datetime.datetime.strptime(i[0:24], "%a %b %d %H:%M:%S %Y").strftime("%s")
        dtime = int(dtime)
        if jobtime == 0 or jobtime > dtime:
            jobtime = dtime
   
    return jobtime

# nvramへ起動時間を設定.
def set_to_nvram(time):
    nvram_cmd = ('sudo nvram-wakeup -C /etc/nvram-wakeup.conf -A -s '+str(time))
    p = subprocess.Popen(   args=nvram_cmd, shell=True, close_fds=True,
                            stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

ここで大事なのは、「atqをsudoつけて実行すること。」
でないと、自分の持ってるジョブしか出ないので、www-dataの持ち物になってるepgrecのジョブが出力されません。

これを、シャットダウン時に実行されるようにする為、/etc/rc0.dに、このコマンドを実行するスクリプトを追加しました。
 →これが、init的にOKなのかは知らない。。。

ここまでで、「シャットダウンしても、atジョブ時間にPC起動する」環境が整いました。

あとは、「いいタイミングで勝手にシャットダウン」するだけです。

カテゴリー: Linux   パーマリンク

コメントをどうぞ

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

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">