2013-05-02 2 views
1

Я пытаюсь написать скрипт Python, который будет ping/icmp IP-адресом и скажите, жив ли он. Я делаю это, потому что у меня прерывистая проблема. Я хотел выполнить ping, зарегистрировать результат, поспать на некоторое время и снова попробовать ping. Я пробовал цикл while, но все еще получаю такие ошибки:Python script - log failed icmp/ping response - problems

line 33, in (module) systemPing('192.168.1.1') 
line 30, in systemPing time.sleep(30) 
KeyboardInterrupt 

Я использую Python 2.6.

В идеале, мой вопрос заключается в том, как я прохожу через этот метод/функцию systemPing и какие ошибки есть в моем коде? Сценарий работает, но я получаю эти ошибки, когда я нажимаю ctrl-c.

from subprocess import Popen, PIPE 
import datetime, time, re 

logFile = open("textlog.txt", "a") 

def getmyTime(): 
    now = datetime.datetime.now() 
    return now.strftime("%Y-%m-%d %H:%M \n") 

startTime = "Starting ..." + getmyTime() 
logFile.write(startTime) 
logFile.write("\n") 

def systemPing(x): 
    cmd = Popen("ping -n 1 " + x , stdout=PIPE) 
    #print getmyTime() 
    for line in cmd.stdout: 
     if 'timed out' in line: 
      loggedTime = "Failure detected - " + getmyTime() 
      logFile.write(loggedTime) 
     if 'Reply' in line: 
      print "Replied..." 
    logFile.close() 
    print "Sleeping 30mins ... CTRL C to end" 
    time.sleep(30) #1800 is 30mins 
    systemPing('192.168.1.1') 

if __name__ =='__main__': 
    systemPing('192.168.1.1') 

Любая помощь всегда приветствуется. Спасибо.

ответ

1

Это не действительно ошибка как таковая, это просто поведение по умолчанию для Python, после получения SIGINT (что и происходит при нажатии CTRL-C), чтобы повысить исключение KeyboardInterrupt.

Вы получите то же самое, если вы посылаете сигнал с kill(1), как ...

$ kill -INT <pid> 

Если вы хотите, чтобы справиться с этим, то вы можете изменить код, чтобы что-то вроде ...

if __name__ =='__main__': 
    try: 
     systemPing('192.168.1.1') 
    except KeyboardInterrupt: 
     print 'Finished' 

... или что бы вы там ни хотели.

+0

Хорошо, я понимаю. Мне было интересно, почему это работает, но все же я получаю то, что я воспринимаю как ошибки. Я не думал об этом, но никогда не использовал его. Я отредактирую скрипт и тест. Спасибо. – user2105764

+0

Этот оператор try/except не работает. Он просто запускается один раз и выходит. На положительной ноте; без ошибок. – user2105764

+0

@ user2105764 Не должно быть петли. Я думал, вы просто хотите разрешить CTRL-C выйти из программы без сообщения об ошибке. Вы действительно хотите отключить CTRL-C? – Aya