A ajuda básica do script shell Unix é necessária por favor?

0

Eu preciso de ajuda para escrever um script shell básico do Unix que será executado no AIX:

Loop que executará um comando netstat (netstat -an | grep 16752 | grep ESTABLISHED | wc -l) que conta as sessões a cada segundo e também obtém o registro de data e hora e redireciona esses dados para um log para revisão. Eu gostaria de poder inserir em minutos quanto tempo deve ser executado, se possível. Eu gostaria que a saída fosse bem básica e parecida com a seguinte:

timestamp  #count
timestamp  #count
    
por studiohack 04.08.2011 / 02:46

2 respostas

1

Aqui está uma sugestão.

date +%s

retorna o número de segundos desde a época. Como existem 60 segundos em um minuto, você pode facilmente fazer as contas. Tanto o ksh quanto o bash permitem que você faça aritmética com parênteses duplos ao redor de uma expressão como essa

echo $(( 324567 / 60 ))
    
por 04.08.2011 / 03:03
1

Eu testei isso com o ksh, que acredito ser o shell usado no AIX. Ao contrário do meu comentário à pergunta, parece "até" funciona bem. Este script assume que bc está funcionando; Não tenho certeza se a sintaxe $( ) funciona em seu provável shell antigo, mas é uma aposta e sem informações de versão específica / shell, ele terá que fazer.

Uso: thisscript.sh *minutes* Chama o script com um número de minutos . Ele executará os comandos a cada segundo até que seja contado do loop_total calculado para zero.

Não há saída visível além de algumas mensagens de "início / fim" e de duração. Tudo é canalizado para o LOG_FILE. Se você quiser saída para a tela, você provavelmente terá que usar variáveis para armazenar os dados e, em seguida, saída para o LOG_FILE. Felicidades.

#!/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
    
por 08.08.2011 / 23:56