前々回のときに書いた,uptime から時間の取得が失敗する問題は,ログを出力するようにプログラムに変更を加えて走らせ,ログの内容を解析して修正した結果,解決した.
起動時間が1時間未満の時は, “xx:xx” 形式でなくて, “xx min” と表示されるようだ.
全部で4種もパターンがあるわけか… 統一すれば良いのになぜにわざわざばらばらに…?
完成品はこんな感じ.他に定期的に呟くようなステータスなんてあったかな?
#!/usr/bin/env python # -*- coding=utf-8 -*- import twitter import time import sys import re from subprocess import Popen, PIPE ''' サーバーの状態をお知らせするBOT ''' # ログイン api = twitter.Api(username='twitter user', password='twitter pass') # uptime を取得 p = Popen(["uptime"], shell=True, stdin=None, stdout=PIPE, close_fds=True) uptime = p.stdout.readline() # 日数を取得 update = "" updays = re.search('up (d+) days', uptime) if updays is not None: update = updays.group(1) + "日と" # 時間を取得 uphm = re.search('(d{1,2}):(d{1,2}), +d+ user', uptime) if uphm is None: uphm = re.search('(d{1,2}) min,', uptime) tmp = "0時間" + uphm.group(1) + "分" else: tmp = uphm.group(1) + "時間" + uphm.group(2) + "分" update = update + tmp update = update + "正常に連続稼動しています." load = re.search('(load average: d+.d{2}, d+.d{2}, d+.d{2})', uptime) strnow = time.strftime("(%a, %d %b %Y %H:%M:%S %Z)") # ツイートを投稿 api.PostUpdates(update.decode("utf-8")+'- '+load.group(0)+' '+strnow)