Я проверил это под 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