2013-05-02 78 views
1

我正在尝试编写一个Python脚本,它会ping/icmp一个IP地址并告诉我它是否还活着。我这样做是因为我有一个间歇性问题。我想ping,记录结果,睡一段时间,然后重新尝试ping。我尝试了一个while循环,但仍然得到这样的错误:Python脚本 - 记录失败的icmp/ping响应 - 问题

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 2013-05-02 15:13:09

+0

try/except语句不循环。它只运行一次并退出。积极的一面,没有任何错误。 – user2105764 2013-05-02 17:05:21

+0

@ user2105764它不应该循环。我以为你只是想让CTRL-C在没有错误信息的情况下退出程序。你真的想禁用CTRL-C吗? – Aya 2013-05-02 17:08:16