这是我的情况的简短版本。我当前的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 ++)。提前道歉!答案 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
根据需要调整超时。