这是我的情况的一个简短的版本。我目前的ISP没有正常工作,因此,我想记录一下成功和失败,以证明它不起作用。我会在Linux上,但是Windows也会很好。我一直在阅读,据我所知,一个shell脚本或Python代码最好。
因此,更详细地说:我想每5秒在一个网站上做一次平操作。如果有成功的ping,它应该将ping的正常结果输出到一个文件中。但是Ping失败有很长的超时时间,所以我想让程序在大约4秒内没有成功,它停止ping尝试,但仍然输出完整的ping数据"1数据包传输,0接收“等等,就像它已经用完时间一样。
以下是我到目前为止所拥有的:
while true
do
ping -c1 -w4 www.example.com >> log.txt
sleep 5
done不幸的是,有两个问题。首先,"-w4“并没有像我想的那样在4秒后超时。其次,“睡眠”增加了已经花费的时间。因此,如果ping需要3秒,则循环将花费8秒。由于我将编写另一个程序,它将计算成功、失败和输出停机时间的百分比,因此在失败时循环需要额外的时间是不可接受的。
所以,考虑到我需要什么,最好的方法是什么?我所得到的改进能满足需求吗?谢谢你的帮助!
PS:我对编写shell脚本几乎一无所知(虽然我对终端很在行),而且我对Python的了解甚至更少(尽管我知道C++)。提前道歉!
发布于 2013-09-17 21:44:56
如果你真的想让整个循环不超过5秒,你必须知道ping花了多长时间,然后从5减去它,然后睡觉。
您可以通过记录ping之前和之后的时间并减去,或者使用time -p命令运行ping (第一个非空行的第二列将作为浮动,如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()发布于 2013-09-17 21:44:07
您可以将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如果需要,调整超时。
https://stackoverflow.com/questions/18860271
复制相似问题