結構あっさりできた。
前回までで、自動起動自体の仕組みは完成してたので、あとは、
- 次の直近の予約ジョブを割り出す。
- いいタイミングで次回起動時間を設定して、シャットダウンする。
の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)
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起動する」環境が整いました。
あとは、「いいタイミングで勝手にシャットダウン」するだけです。