在linux中记录ping成功和失败

时间:2013-09-17 21:33:28

标签: python linux shell ping

这是我的情况的简短版本。我当前的ISP工作不正常,因此,我想记录ping成功和失败,以证明它不起作用。我会在Linux上,但Windows也没关系。我一直在阅读,据我所知,shell脚本或Python代码效果最好。

所以,更详细一点:我想每5秒在一个网站上进行一次ping操作。如果ping成功,则应将ping的正常结果输出到文件。然而Ping失败有一个很长的超时,所以我想制作程序,以便如果ping在4秒左右没有成功,它会停止ping尝试,但仍然输出完整的ping数据“1包传输,0收到“等,就像它已经没有时间一样。

这是我到目前为止所做的:

while true
do
    ping -c1 -w4 www.example.com >> log.txt
    sleep 5
done

不幸的是,有2个问题。首先,“-w4”并没有像我想象的那样让它在4秒后超时。其次,“睡眠”增加了已经花费的时间。因此,如果ping需要3秒,则循环将花费8秒。由于我将编写另一个计算成功,失败并输出停机时间百分比的程序,因此在循环中花费大量额外时间是不可接受的。

所以,鉴于我需要什么,最好的方法是什么?我可以改进以满足需求吗?谢谢你的帮助!

PS:我对编写shell脚本几乎一无所知(虽然我能胜任终端),而且我对Python的了解甚少(尽管我知道C ++)。提前道歉!

2 个答案:

答案 0 :(得分:1)

如果你真的想让整个循环花费不超过5秒,你必须知道ping花了多长时间,然后从5减去它,然后睡不着。

您可以通过记录ping和减去之前和之后的时间,或者使用time -p命令运行ping(第一个非空白行的第二列)从bash执行此操作将挂钟作为浮动时间,如0.01)。

但我认为Python会更容易:

import datetime
import subprocess
import time

while True:
    start = datetime.datetime.now()
    with open('log.txt', 'a+b') as logfile:
        subprocess.call(['ping', '-c1', '-w4', 'www.example.com'], stdout=logfile)
    delta = datetime.datetime.now() - start
    time.sleep(delta.total_seconds())

当然,如果ping在最多5秒钟内没有完成,这将无效,因为你无法在负面时间内睡觉。你可以通过使用明确的Popen并在其上调用wait(5)来解决这个问题,然后在它失败时进行查杀......

但是,只要总是给它5秒钟,它是否更加简单,无论它是否需要那么多:

while True:
    with open('log.txt', 'a+b') as logfile:
        ping = subprocess.Popen(['ping', '-c1', '-w4', 'www.example.com'],
                                stdout=logfile)
        time.sleep(5)
        # Not strictly necessary, but it avoids signaling for no reason
        if ping.poll() is None:
            ping.kill()
        ping.wait()

答案 1 :(得分:0)

您可以在后台使用ping,并使用其他子进程等待并终止它:

while true
do
    ping -c1 www.example.com >> log.txt &
    p=$!
    ( sleep 4s; kill -s SIGABRT "$p"; ) &>/dev/null &
    wait "$p"
    sleep 5
done

根据需要调整超时。

相关问题