带有同步的shell脚本
问题描述:
我必须编写一个脚本,在其中“同时”在我的机器和远程计算机上执行tcpdump。这是捕获的开始(第0秒)应该是同步的,以便我可以比较我分析中的两个tcpdump。带有同步的shell脚本
有没有办法实现这个目标?
答
如果您只需要大致的时间(例如,在200ms的范围内具有误差范围),那么只要确保两台机器具有相同的时间(例如通过NTP)然后使用例如cron同时运行这两个命令。
如果您希望更频繁地使用at command而不是cron
。你可以做一些简单的日期算术,例如看到这一点:
或休眠状态,直到指定的时间:
在这两个脚本(即本地和远程),然后运行本地命令并使用ssh
在远程计算机上运行该命令。
如果您可以使用例如Python,你可以使用datetime
模块,例如看到这一点:
的想法是相当多这样的:
- 以当前时间
- 计算目标时间 - 添加一些垫子秒(例如10秒)
- 用这段时间作为参数运行这两个脚本(本地一个,远程一个与
ssh
) - 睡到那个时候在这两个脚本 - 如果你不能
ssh
在10秒甚至更糟糕的,如果它需要超过10秒来运行本地脚本,你必须在这两个更严重的问题比这一个:) - 运行
tcpdump
脚本 - 他们应该非常同步(有一定的宽容,但我不认为它会超过任何最近的系统50ms)
希望这有助于。
答
这里的东西我写了刚才多个测试客户端同步:
#!/usr/bin/python
import time
import sys
now = time.time()
mod = float(sys.argv[1])
until = now - now % mod + mod
print "sleeping until", until
while True:
delta = until - time.time()
if delta <= 0:
print "done sleeping ", time.time()
break
time.sleep(delta/2)
这个脚本休眠,直到下一个“四舍五入”或“尖”的时间。
一个简单的用例是在一个终端运行./sleep.py 10; ./test_client1.py
,在另一个终端运行./sleep.py 10; ./test_client2.py
。
你想确保你的机器上的时钟是同步的。
或者,使用tcpdump中的这些选项之一,使用可为您提供完整时间戳的内容。
最后你可以运行类似execnet在(几乎)同时启动多台计算机上的命令。
200 MS的可能性尽可能接近你可以得到的。如果可能的话,也可以在tcpdump中使用包含MS级别时间戳的格式(我不使用tcmpdump,也许它默认是在那里)。祝你好运。 – shellter 2012-02-14 00:53:21