首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在linux中记录ping的成功和失败

在linux中记录ping的成功和失败
EN

Stack Overflow用户
提问于 2013-09-17 21:33:27
回答 2查看 4K关注 0票数 1

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

因此,更详细地说:我想每5秒在一个网站上做一次平操作。如果有成功的ping,它应该将ping的正常结果输出到一个文件中。但是Ping失败有很长的超时时间,所以我想让程序在大约4秒内没有成功,它停止ping尝试,但仍然输出完整的ping数据"1数据包传输,0接收“等等,就像它已经用完时间一样。

以下是我到目前为止所拥有的:

代码语言:javascript
复制
while true
do
    ping -c1 -w4 www.example.com >> log.txt
    sleep 5
done

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

所以,考虑到我需要什么,最好的方法是什么?我所得到的改进能满足需求吗?谢谢你的帮助!

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-17 21:44:56

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

您可以通过记录ping之前和之后的时间并减去,或者使用time -p命令运行ping (第一个非空行的第二列将作为浮动,如0.01)来实现这一点。

但是我认为Python会更容易做到这一点:

代码语言:javascript
复制
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秒就更简单了,不管它是否需要这么多:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-09-17 21:44:07

您可以将ping放在后台,然后使用另一个子进程等待并终止它:

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

如果需要,调整超时。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18860271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档