script não está relatando status do serviço corretamente

0

Eu tenho um script que eu uso para o iperf para poder iniciar, parar e verificar o status dele como um serviço típico. Se eu emitir um "service iperf start" ou um "service iperf stop", ele funcionará corretamente. Quando eu tento emitir um "status iperf de serviço", ele sempre retorna como em execução, mesmo que não seja.

Ao executar:

#service iperf status
/usr/bin/iperf pid 37567 is running!!!

Quando não está em execução:

# service iperf status
/usr/bin/iperf pid is running!!

Aqui está o meu script inteiro:

#!/bin/bash

# chkconfig: - 50 50
# description: iperf

DAEMON=/usr/bin/iperf
service=iperf
info=$(pidof /usr/bin/iperf)
is_running='ps aux | grep -v grep | grep iperf | wc -l | awk '{print $1}''

case "$1" in
      start)
              $DAEMON -s -D
              ;;
      stop)
              pidof $DAEMON | xargs kill -9
              ;;
      status)

             if [ $is_running != "1" ];
             then
                echo $DAEMON pid $info is running!!!
              else
                echo $DAEMON is NOT running!!!
              fi
              ;;
      restart)
              $DAEMON stop
              $DAEMON start
              ;;
      *)
              echo "Usage: $0 {start|stop|status|restart}"
              exit 1
              ;;
esac

Parece que não é possível ler após a primeira instrução de eco na seção de status do script. Eu executei o comando ps fora do script na linha de comando para verificar se estou obtendo a saída correta. Se o serviço estiver em execução, ele retornará um "1" exatamente como o script verifica. Se não estiver rodando, ele retorna um "0", então ele deve passar para a próxima instrução de eco, mas não é. Alguém pode me dizer como consertar isso?

Estou no RHEL 6.7 versão 4.1.2

    
por user53029 07.01.2016 / 20:23

2 respostas

0

Eu percebi isso. Tem algo a ver com o uso de ps. Eu acho que quando você chama o comando "service iperf status", o ps sempre encontrará um processo com iperf nele. Portanto, o valor sempre será "1" e nunca será mais. Então usei o netstat para encontrar o processo. No meu script estou usando:

IS_RUNNING=$(netstat -anp | grep ":5001" | grep "iperf" | awk '{print $7}' | cut -d"/" -f 2)

O qual, se rodando, resultará nesse comando encontrando "iperf"

Então você faz a declaração if assim:

if [ "$IS_RUNNING" = iperf ];

E isso resolveu meu problema.

    
por 07.01.2016 / 22:28
0

Eu acho que você quer mudar a linha

if [ $is_running != "1" ];

para ser

if [ "$is_running" != "0" ];

para que o if falhe quando não houver instâncias de iperf em execução e imprima a mensagem de status desejada. Como está escrito atualmente, ele relatará apenas que iperf não está sendo executado quando há exatamente 1 processo dele.

    
por 07.01.2016 / 20:37