当终端应该使用python循环连续打印时,它停止打印

当终端应该使用python循环连续打印时,它停止打印,python,linux,bash,terminal,ubuntu-14.04,Python,Linux,Bash,Terminal,Ubuntu 14.04,我已经编写了一个python脚本,可以自动检查internet是否可用,并使用我的学生帐户登录,以及在发现与internet失去连接时重新启动ngrok。我在安装了Ubuntu 14.04的笔记本电脑上运行这些脚本 python脚本如下所示: #!/usr/bin/env python3 # -*- coding:utf-8 -*- import os import urllib import http from urllib.request import urlopen import htt

我已经编写了一个python脚本,可以自动检查internet是否可用,并使用我的学生帐户登录,以及在发现与internet失去连接时重新启动ngrok。我在安装了Ubuntu 14.04的笔记本电脑上运行这些脚本

python脚本如下所示:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import os
import urllib
import http
from urllib.request import urlopen
import http.cookiejar
import time
import urllib.request, urllib.parse, urllib.error
import urllib.request, urllib.error, urllib.parse


def is_online():
    """check net available"""
    pattern = "location.href='http://210.77.16.21:80"
    with urlopen('http://www.baidu.com') as fh:
        data = fh.read().decode()
    if len(data) < 500 or pattern in data:
        return False
    else:
        return True

def login(user, password):
    login_url = 'http://210.77.16.21/eportal/InterFace.do?method=login'
    login_data = {
        'userId': user,
        'password': password,
        'service': '',
        'queryString': 'wlanuserip=0bc386d9e643d188b011a0d00c9b5c40&wlanacname=5fcbc245a7ffdfa4&ssid=&nasip=2c0716b583c8ac3cbd7567a84cfde5a8&mac=53ba540bde596b811a6d5617a86fa028&t=wireless-v2&url=2c0328164651e2b4f13b933ddf36628bea622dedcc302b30',
        'operatorPwd': '',
        'validcode': ''
    }
    login_data = urllib.parse.urlencode(login_data)
    cookie = http.cookiejar.CookieJar()
    cookie_support = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler)
    urllib.request.install_opener(opener)
    request = urllib.request.Request(url=login_url, data=login_data.encode())
    response = urllib.request.urlopen(request)
    html = response.read().decode()
    logined = True
    if "success" in html:
        pass
    else:
        logined = False
    return logined

if __name__ == '__main__':
    while True:
        print (time.strftime('%l:%M%p %Z on %b %d, %Y'))
        if is_online():
            print ("++++++++++ you have already been online ++++++++++\n")
        else:
            print ("---------- you have lost net connection ----------\n")
            os.system('sudo hclient -r -v eth0')
            os.system('sudo dhclient -v eth0')
            login('username', 'password')
            os.system('./ngrok.sh')
        time.sleep(20)
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
keshawn  26339  0.0  0.1  59360 15656 pts/0    S+   00:00   0:00 python3 ./net.py
在终端中运行
python3./net.py
时,它应该每20秒连续打印一次信息

然而,有线的情况是,终端会在一段时间后停止打印,并卡在这里:

12:17AM CST on Aug 06, 2017
++++++++++ you have already been online ++++++++++
12:18AM CST on Aug 06, 2017
++++++++++ you have already been online ++++++++++
12:18AM CST on Aug 06, 2017
++++++++++ you have already been online ++++++++++
12:18AM CST on Aug 06, 2017
++++++++++ you have already been online ++++++++++
12:19AM CST on Aug 06, 2017
++++++++++ you have already been online ++++++++++
12:19AM CST on Aug 06, 2017
错误似乎发生在打印(time.strftime(“%l:%M%p%Z,在%b%d,%Y'))的第
行之后。

我已经测试了两次,第一次在运行大约12小时后卡住,第二次在不到20分钟的时间内卡住

我还使用命令
pa-aux | grep python3
检查了python脚本状态,如下所示:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import os
import urllib
import http
from urllib.request import urlopen
import http.cookiejar
import time
import urllib.request, urllib.parse, urllib.error
import urllib.request, urllib.error, urllib.parse


def is_online():
    """check net available"""
    pattern = "location.href='http://210.77.16.21:80"
    with urlopen('http://www.baidu.com') as fh:
        data = fh.read().decode()
    if len(data) < 500 or pattern in data:
        return False
    else:
        return True

def login(user, password):
    login_url = 'http://210.77.16.21/eportal/InterFace.do?method=login'
    login_data = {
        'userId': user,
        'password': password,
        'service': '',
        'queryString': 'wlanuserip=0bc386d9e643d188b011a0d00c9b5c40&wlanacname=5fcbc245a7ffdfa4&ssid=&nasip=2c0716b583c8ac3cbd7567a84cfde5a8&mac=53ba540bde596b811a6d5617a86fa028&t=wireless-v2&url=2c0328164651e2b4f13b933ddf36628bea622dedcc302b30',
        'operatorPwd': '',
        'validcode': ''
    }
    login_data = urllib.parse.urlencode(login_data)
    cookie = http.cookiejar.CookieJar()
    cookie_support = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler)
    urllib.request.install_opener(opener)
    request = urllib.request.Request(url=login_url, data=login_data.encode())
    response = urllib.request.urlopen(request)
    html = response.read().decode()
    logined = True
    if "success" in html:
        pass
    else:
        logined = False
    return logined

if __name__ == '__main__':
    while True:
        print (time.strftime('%l:%M%p %Z on %b %d, %Y'))
        if is_online():
            print ("++++++++++ you have already been online ++++++++++\n")
        else:
            print ("---------- you have lost net connection ----------\n")
            os.system('sudo hclient -r -v eth0')
            os.system('sudo dhclient -v eth0')
            login('username', 'password')
            os.system('./ngrok.sh')
        time.sleep(20)
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
keshawn  26339  0.0  0.1  59360 15656 pts/0    S+   00:00   0:00 python3 ./net.py

那么,有人能找出为什么会发生这种奇怪的现象吗?

您可以在
urlopen()
中添加一个超时,因为它可能会挂起。特别是,邪恶的大学wifi经常导致路由问题,表现为挂起。@Gribouillis,谢谢,它可以工作。我已经推上了完整的脚本,希望它能为以后遇到这个问题的人提供参考。