mieki256's diary



2019/09/16(月) [n年前の日記]

#1 [pc] WLI-UC-GNM2Sのその後

金具を交換したことで、単にsshで接続しておくだけなら5時間ほど切れなくなったし、これで多少は使えるようになったかなーと思っていたのだけど。実際にアレコレ作業をしてみたら、5分で切れたり、30分で切れたりで。ダメだこりゃ…。

どうやら、一時的にでも転送量が増える作業をしてしまうと発熱も増えて、動作可能な温度を超えてしまって切断される、ような気がする。そのへんに転がってる or 近所で入手できる金具程度では、放熱が全然間に合っていないのだろうな…。

#2 [python] pythonでpingを打つスクリプト

無線LAN子機がLAN接続できていた時間を計るために、Pythonでスクリプトを書いてみたり。1秒毎にpingを打って、反応が無かったら繋がっていた時間を表示して終了、みたいな。せっかくだから curses を使って、時間表示もするようにしてみたり。

動作環境は、Windows10 x64 + Python 2.7.16 32bit + curses。

curses を使うと、端末上の好きな位置に文字列を表示できる。Windows版Python には標準で入ってなかった記憶があるので、以下から curses-2.2.1+utf8-cp27-cp27m-win32.whl を入手してインストールさせてもらった。ありがたや。

_Python Extension Packages for Windows - Christoph Gohlke

pip install curses-2.2.1+utf8-cp27-cp27m-win32.whl

今回書いたスクリプトは以下。

_ping_monitor.py
"""
display time and ping send.

Windows10 x64 + Python 2.7.16 32bit
"""

import subprocess
import curses
import os
import time
from datetime import datetime
import sys
import argparse

def is_connectable(host):
    """Ping."""
    copt = "-c"
    tmout = "3"
    if os.name == "nt":
        # Windows NT
        copt = "-n"
        tmout = "3000"
    ping = subprocess.Popen(
        ["ping", "-w", tmout, copt, "1", host],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE
        )
    ping.communicate()
    return ping.returncode == 0


def get_hms(t):
    """Get HH:MM:SS."""
    h = int(t / 3600)
    m = int((t / 60) % 60)
    s = int(t % 60)
    return h, m, s


def win_main(win):
    """Main."""
    curses.curs_set(0)
    win.nodelay(True)
    key = ""
    win.clear()
    tm = time.time()
    
    while True:
        n = time.time()
        t = "%s" % datetime.fromtimestamp(n)
        win.addstr(0, 0, starttimestr)

        d = n - tm
        if d >= 1.0:
            win.addstr(3, 0, "ping")
            result = is_connectable(host)
            if result is not True:
                win.addstr(1, 0, "%s - %s is dead." % (t, host))
                break
            else:
                win.addstr(1, 0, "%s - %s is alive." % (t, host))
                
            h, m, s = get_hms(n - starttime)
            win.addstr(2, 0, "%d:%02d:%02d" % (h, m, s))
            tm = time.time()
        elif d >= 0.4:
            win.move(3, 0)
            win.clrtoeol()
        
        try:
            key = win.getkey()
            if key == os.linesep or key == "q" or ord(key) == 27:
                break
        except Exception as e:
            # No input
            pass

        time.sleep(0.2)

parser = argparse.ArgumentParser(description="Send ping.")
parser.add_argument("hostname", metavar="HOSTNAME", help="host name")
args = parser.parse_args()

host = args.hostname

starttime = time.time()
starttimestr = "%s - start" % datetime.fromtimestamp(starttime)

curses.wrapper(win_main)

print(starttimestr)

endtime = time.time()
t = "%s" % datetime.fromtimestamp(endtime)
print("%s - %s is dead." % (t, host))

h, m, s = get_hms(endtime - starttime)
print("%d:%02d:%02d" % (h, m, s))

sys.exit()

使い方は以下。
python ping_monitor.py HOSTNAME

実行中に、qキーかESCキーを押せば途中で終了できる。

参考ページ。 :

気づいた点をメモ。 :

一般的にこの手のスクリプトは *NIX上で動かすことを前提にしているようで、ping に渡すオプションも *NIX版の ping に合わせている事例が多いっぽい。ただ、Windowsに標準で入っている ping は、オプション指定が違うわけで。
  • 回数の指定 : *NIX は -c N。Windows は -n N。
  • タイムアウト値 : *NIX は秒。Windows はミリ秒。
そのあたりは、if os.name == "NT": で変更するようにした。

以上、1 日分です。

過去ログ表示

Prev - 2019/09 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project