как проверить разницу во времени между машинами linux не более 5 секунд

В Linux вы можете увидеть, какие типы файловых систем доступны в работающем ядре, в файле / proc / filesystems . Содержимое этого файла создается ядром в реальном времени при чтении, поэтому оно отражает текущий статус. Формат этого файла немного раздражает: каждая строка содержит либо 8 пробелов, за которыми следует тип файловой системы, либо nodev , за которыми следуют 3 пробела, за которыми следует тип файловой системы. Удалите первые 8 символов каждой строки, чтобы получить только доступные типы файловых систем, или используйте grep -w (если вы не ищете тип файловой системы с именем nodev ) .

if grep -qw aufs /proc/filesystems; then
  echo aufs is available
fi

Это не полная история, потому что драйвер файловой системы может быть доступен в виде модуля, который в данный момент не загружен. Предполагая, что вы можете загружать модули, если файловая система недоступна, попробуйте загрузить ее. Модули файловой системы имеют псевдоним вида fs- FSTYPE (фактическое имя модуля часто является именем типа файловой системы, но не всегда).

if grep -qw aufs /proc/filesystems; then
  echo aufs is available
elif modprobe fs-aufs; then
  echo now aufs is available
fi

Это для файловых систем ядра. Для файловых систем FUSE проверьте, доступна ли файловая система fuse , и найдите исполняемый файл, реализующий файловую систему. Хотя вы можете найти fuse в / proc / filesystems , он только говорит вам, доступен ли он, а не имеет ли ваша программа достаточно прав для его использования. На практике более надежным тестом является проверка, можете ли вы писать в / dev / fuse .

if [ -w /dev/fuse ]; then
  echo FUSE is available
  if type unionfs-fuse >/dev/null 2>/dev/null; then 
    echo unionfs-fuse is available
  fi
fi
1
22.04.2018, 12:23
1 ответ

Используйте date +%sдля получения метки времени UNIX, например 1524388823. В отличие от даты, зависящей от локали, -удобочитаемой для человека даты, ее легче сравнивать в сценарии.

На машинах с правильной синхронизацией времени что-то вроде этого должно работать:

a=$(date +%s)
b=$(ssh user@remote date +%s)
c=$(date +%s)

if [ $a -le $b  -a  $b -le $c ]
then
    echo Seems to be OK.
fi
  • (a)— местное время до SSH,
  • (b)— удаленное время,
  • (c)— местное время после SSH.

Если (a <= b <= c)разумно предположить, что время синхронизировано. Это вообще не принимает во внимание задержку сети -проверьте дельту (a,c )для этого -, но все же это должно быть разумным. Предполагая, что SSH не будет запрашивать пароль и/или вы не будете тратить весь день на его ввод.

Если вы все еще хотите добавить к этому 5 секунд, используйте -5 и c+5. Конечно, это дает 5 секунд в любом направлении -и не считается 5-секундным окном для всех машин. Но если вы на самом деле не выполняете миссию в дальнем космосе, как предполагают ваши имена хостов, в первую очередь нет причин принимать такое огромное расхождение во времени.

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

1
27.01.2020, 23:43

Теги

Похожие вопросы