⛓️ Как определить, как долго указанный удаленный сервер или устройство находились в автономном режиме |

⛓️ Как определить, как долго указанный удаленный сервер или устройство находились в автономном режиме

Мануал

Создайте скрипт оболочки, чтобы определить, как долго указанный удаленный сервер или устройство находились в автономном режиме.

Он не предназначен для замены решения для мониторинга, но для определения того, сколько времени потребуется для перезагрузки сервера или устройства.

Он использует преобразование секунд в читаемый человеком временную метку для отображения результатов.

#!/bin/bash
# Determine how long remote server was offline

# initial sleep time
sleep_time=1

# ping timeout
timeout=5

if [ "$#" -ne "1" ]; then
  echo "Provide server/device address as a parameter"
  exit 1
fi

# server/device address is provided as a first parameter
address="$1"

# function to pretty print time
function pretty_time() {
  # calculate seconds for each time period
  seconds_in_year=$(  echo "(365.2425  * 24 * 60 * 60)/1" | bc)
  seconds_in_month=$( echo "(30.436875 * 24 * 60 * 60)/1" | bc)
  seconds_in_day=$(   echo "(            24 * 60 * 60)/1" | bc)
  seconds_in_hour=$(  echo "(                 60 * 60)/1" | bc)
  seconds_in_minute=60

  seconds_param="$1"

  time_string=""

  # take care of years
  if [ "$seconds_param" -ge "$seconds_in_year" ]; then
    years=$(expr $seconds_param \/ $seconds_in_year)
    seconds_param=$(expr $seconds_param - $years \* $seconds_in_year)
    if [ "$years" -gt "1" ]; then
      time_string="$years years"
    elif [ "$years" -eq "1" ]; then
      time_string="$years year"
    fi
  fi
  # take care of months
  if [ "$seconds_param" -ge "$seconds_in_month" ]; then
    months=$(expr $seconds_param \/ $seconds_in_month)
    seconds_param=$(expr $seconds_param - $months \* $seconds_in_month)
    if [ "$months" -gt "1" ]; then
      time_string="$time_string $months months"
    elif [ "$months" -eq "1" ]; then
      time_string="$time_string $months month"
    fi
  fi

  # take care of days
  if [ "$seconds_param" -ge "$seconds_in_day" ]; then
    days=$(expr $seconds_param \/ $seconds_in_day)
    seconds_param=$(expr $seconds_param - $days \* $seconds_in_day)
    if [ "$days" -gt "1" ]; then
      time_string="$time_string $days days"
    elif [ "$days" -eq "1" ]; then
      time_string="$time_string $days day"
    fi
  fi
  
  # take care of hours
  if [ "$seconds_param" -ge "$seconds_in_hour" ]; then
    hours=$(expr $seconds_param \/ $seconds_in_hour)
    seconds_param=$(expr $seconds_param - $hours \* $seconds_in_hour)
    if [ "$hours" -gt "1" ]; then
      time_string="$time_string $hours hours"
    elif [ "$hours" -eq "1" ]; then
      time_string="$time_string $hours hour"
    fi
  fi
  
  # take care of minutes
  if [ "$seconds_param" -ge "$seconds_in_minute" ]; then
    minutes=$(expr $seconds_param \/ $seconds_in_minute)
    seconds_param=$(expr $seconds_param - $minutes \* $seconds_in_minute)
    if [ "$minutes" -gt "1" ]; then
      time_string="$time_string $minutes minutes"
    elif [ "$minutes" -eq "1" ]; then
      time_string="$time_string $minutes minute"
    fi
  fi
  
  # take care of seconds
  seconds=$seconds_param
  if [ "$seconds" -gt "1" ]; then
      time_string="$time_string $seconds seconds"
  elif [ "$seconds" -eq "1" ]; then
      time_string="$time_string $seconds second"
  fi
  
  echo "$time_string" | sed "s/^ //"
}
  
# initial state
state=0

# server/device was offline when script started
ping -c 1 -W $timeout -q $address 2>&1 1>/dev/null
exit_code="$?"
if [ "$exit_code" -gt "0" ]; then
  state_in="$(date +%s)"
  state=2
  echo "Server/device [${address}] was not responding at [$(date --date="@${state_in}" -R)] when script was executed"
else
  echo "Server/device [${address}] was responding at [$(date -R)] when script was executed"
fi

while true; do
  ping -c 1 -W $timeout -q $address 2>&1 1>/dev/null
  exit_code="$?"

  # server/device was offline when script started, but it is online now
  if [ "$exit_code" -eq "0" ] && [ "$state" -eq "2" ]; then
    state_out="$(date +%s)"
    state_diff="$(expr $state_out  - $state_in)"
    state=0
    echo "Server/device [${address}] started responding at [$(date --date="@${state_in}" -R)]"
    echo "Server/device [${address}] was offline for at least [$(pretty_time $state_diff)]"
  # server/device was online, but it is offline now
  elif [ "$exit_code" -gt "0" ] && [ "$state" -eq "0" ]; then
    state_in="$(date +%s)"
    state=1
    echo "Server/device [${address}] stopped responding at [$(date --date="@${state_in}" -R)]"
  # server/device was offline, but it is online now
  elif [ "$exit_code" -eq "0" ] && [ "$state" -eq "1" ]; then
    state_out="$(date +%s)"
    state_diff="$(expr $state_out  - $state_in)"
    state=0;
    echo "Server/device [${address}] started responding at [$(date --date="@${state_out}" -R)]"
    echo "Server/device [${address}] was offline for [$(pretty_time $state_diff)]"
  fi
  sleep $sleep_time
done

Пример вывода, когда сервер отвечал во время запуска скрипта оболочки.

$ bash offline.sh 192.0.2.11
Server/device [192.0.2.11] was responding at [Fri, 06 Apr 2018 19:37:49 +0000] when script was executed
Server/device [192.0.2.11] stopped responding at [Fri, 06 Apr 2018 19:38:08 +0000]
Server/device [192.0.2.11] started responding at [Fri, 06 Apr 2018 19:50:22 +0000]
Server/device [192.0.2.11] was offline for [12 minutes 14 seconds] seconds
Server/device [192.0.2.11] stopped responding at [Fri, 06 Apr 2018 19:53:46 +0000]
Server/device [192.0.2.11] started responding at [Fri, 06 Apr 2018 19:55:59 +0000]
Server/device [192.0.2.11] was offline for [2 minutes 13 seconds] seconds

Пример вывода, когда сервер не отвечал во время запуска скрипта оболочки.

$ bash offline.sh 192.0.2.11
Server/device [192.0.2.11] was not responding at [Fri, 06 Apr 2018 19:38:32 +0000] when script was executed
Server/device [192.0.2.11] started responding at [Fri, 06 Apr 2018 19:38:32 +0000]
Server/device [192.0.2.11] was offline for at least [11 minutes 48 seconds] seconds
Server/device [192.0.2.11] stopped responding at [Fri, 06 Apr 2018 19:53:45 +0000]
Server/device [192.0.2.11] started responding at [Fri, 06 Apr 2018 19:55:58 +0000]
Server/device [192.0.2.11] was offline for [2 minutes 13 seconds] seconds

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий