Мне нужна помощь в написании базового сценария оболочки Unix, который будет работать в AIX:

Цикл, который запускает команду netstat (netstat -an | grep 16752 | grep ESTABLISHED | wc -l), которая подсчитывает сеансы каждую секунду, а также получает метку времени и перенаправляет эти данные в журнал для просмотра. Я хотел бы иметь возможность ввести в минутах, как долго это должно продолжаться, если это возможно. Я хотел бы, чтобы вывод был довольно простым и выглядел примерно так:

timestamp  #count
timestamp  #count

2 ответа2

1

Вот подсказка.

date +%s

возвращает количество секунд с начала эпохи. Поскольку есть 60 секунд в минуту, так что вы можете легко сделать математику. И ksh, и bash позволяют выполнять арифметику с двойными скобками вокруг выражения, подобного этому

echo $(( 324567 / 60 ))
1

Я проверил это под ksh, который, я считаю, является оболочкой, используемой в AIX. В отличие от моего комментария к вопросу, кажется, "пока" работает нормально. Этот скрипт предполагает, что bc работает; Я не уверен, работает ли синтаксис $( ) в вашей вероятной старой оболочке, но это азартная игра и без конкретной информации о версии / оболочке, он должен будет это сделать.

Использование: thisscript.sh *minutes* Вызывает сценарий с количеством минут. Он будет запускать команды каждую секунду, пока не произойдет обратный отсчет от вычисленного loop_total до нуля.

Там нет видимого вывода, кроме пары «начало / конец» и длительности сообщений. Все передано в LOG_FILE. Если вы хотите выводить на экран, вам, вероятно, придется использовать переменные для хранения данных, а затем выводить их в LOG_FILE. Приветствия.

#!/bin/sh
LOG_FILE="connections.txt"
PORT="16752"
COMMAND="netstat -an | grep ${PORT} | grep ESTABLISHED | wc -l"
TIMESTAMPER="date +'%D %H:%M:%S'" # Format like "mm/dd/yy hh:mm:ss"


if test -z "$1" ; then
  echo "ERROR: No duration provided"
  exit 1
else 
  INPUT="$1" # Store the number of minutes wanted
  LOOP_TOTAL=$(( ${INPUT} * 60 ))
  echo "Started on $( eval ${TIMESTAMPER} )"
  echo "Executing for: ${LOOP_TOTAL} seconds (${INPUT} minutes)" 
  COUNTDOWN=${LOOP_TOTAL} # Initialize counter

  until test ${COUNTDOWN} -eq 0 ; do
    COUNTDOWN=$(echo "${COUNTDOWN} - 1" | bc)
    OUTPUT=$( eval ${COMMAND} )
    if test -z "${OUTPUT}"; then
      OUTPUT="0" # greps are blank when no connection, so fill out as 0
    fi  

    TIMESTAMP=$( eval ${TIMESTAMPER} )  
    echo "${TIMESTAMP} #${OUTPUT}"
    sleep 1;
  done >> ${LOG_FILE}

  echo "Finished on $( eval ${TIMESTAMPER} ) "
fi

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .