сценарий оболочки с синхронизацией - PullRequest
0 голосов
/ 14 февраля 2012

Я должен написать скрипт, где я беру tcpdump на своей машине и на удаленной машине "одновременно". То есть начало захвата (0-я секунда) должно быть одновременным, чтобы я мог сравнить два tcpdumps в моем анализе.

Есть ли способ, которым я могу этого достичь?

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Если вам просто нужно приблизительное время (например, с погрешностью в диапазоне, скажем, 200 мс), то просто убедитесь, что обе машины имеют одинаковое время (например, через NTP ), а затем используйте, например, cron для одновременного запуска обеих команд.

Если вы хотите, чтобы это происходило чаще, вы можете использовать в команде вместо cron.Вы можете сделать некоторую простую арифметику даты, например, посмотреть это:

или спать до указанного времени:

в обоих сценариях (т. Е. Локальном и удаленном), затем выполните локальную команду и выполните командуна удаленном компьютере с помощью ssh.

Если вы можете использовать, например, Python, вы можете использовать модуль datetime, например, см. это:

Идея в значительной степени такова:

  • Взять текущее время
  • Рассчитать целевое время - добавить несколько секунд подушки (например, 10 секунд)
  • Запустите оба сценария с указанным временем в качестве параметра (один локально, другой удаленно с ssh)
  • Спите до тех пор в обоих сценариях - если вы не можете ssh через 10 секунд или даже хужеесли для запуска локального скрипта требуется более 10 секунд, у вас есть более серьезные проблемы, чем этот:)
  • Запуск tcpdump в обоих сценарияхpts - они должны быть в значительной степени синхронизированы (с некоторым допуском, но я не думаю, что это когда-либо превысит 50 мс в любой недавней системе)

Надеюсь, это поможет.

0 голосов
/ 13 июня 2013

Вот что я написал сейчас для синхронизации нескольких тестовых клиентов:

#!/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, используйте что-нибудьэто дает вам полную метку времени.

-t
Don't print a timestamp on each dump line.
-tt
Print an unformatted timestamp on each dump line.
-ttt
Print a delta (micro-second resolution) between current and previous line on each dump line.
-tttt
Print a timestamp in default format proceeded by date on each dump line.
-ttttt
Print a delta (micro-second resolution) between current and first line on each dump line.

Наконец, вы можете запустить что-то вроде execnet для запуска команд на нескольких машинах (почти) одновременно.

...