sh script não conta o comando top

1

Eu escrevi um script para verificar se o processo está sendo executado ou não no servidor Ubuntu (14.04), ele funciona bem, mas ao testá-lo, descobri que não inclui a contagem de comandos superior em execução em outro terminal

Conteúdo de check-process.sh

 #!/bin/sh 
 OK=1
 CRITICAL=0
 PROCESS_NUM=$( ps -ef | grep $1 | grep -v "grep "|grep -v "sh"|wc -l )
 #echo $PROCESS_NUM

 if [ $PROCESS_NUM = $OK ]
 then
  echo "OK"
 elif [ $PROCESS_NUM = $CRITICAL ]
 then
  echo "CRITICAL"
 elif [ $PROCESS_NUM > $OK ]
 then
  echo "MULTIPLE process are runing"
 else
  echo "error"
 fi

E eu corro o comando top em dois terminais e executo este script da seguinte forma:

./check-process.sh top

A saída é 0 CRITICAL , mas quando eu executo o comando normal ps -ef |grep -v "grep "| wc -l , isso dá duas contagens.

    
por Manish Jaiswal 23.02.2018 / 14:17

1 resposta

6

Como foi apontado nos comentários à questão, o teste com > não faz uma comparação aritmética, mas sim uma lexicográfica (de modo que 2 > 100 seja verdadeira, por exemplo), mas somente dentro de [[ ... ]] . Em [ ... ] , é um operador comum de redirecionamento de saída.

A filtragem grep -v "grep " e grep -v "sh" também pode filtrar processos legítimos da saída ps (por exemplo, se você quiser usar seu script em grep processes).

O script a seguir implementa a mesma lógica, mas usa pgrep :

#!/bin/bash

cmd=$1

pids=( $( pgrep "$cmd" ) )

case "${#pids[@]}" in
    0) echo 'No such process'  ;;
    1) echo 'One such process' ;;
    *) echo 'Many such processes'
esac

Se você estiver executando um comando top em outro terminal, a execução deste script com top como seu argumento informará One such process . A execução de top em dois terminais fará com que ele relate Many such processes .

Com variáveis, como você usa:

#!/bin/bash

cmd=$1

pids=( $( pgrep "$cmd" ) )

critical=0
ok=1

case "${#pids[@]}" in
    $critical) echo 'No such process'  ;;
    $ok)       echo 'One such process' ;;
    *)         echo 'Many such processes'
esac

O script salva os PIDs retornados de pgrep em uma matriz (e é por isso que este é um script bash em vez de sh ) e, em seguida, testa o comprimento da matriz.

A seguir, uma adaptação para sh :

#!/bin/sh

cmd=$1

set -- $( pgrep "$cmd" )

critical=0
ok=1

case "$#" in
    $critical) echo 'No such process'  ;;
    $ok)       echo 'One such process' ;;
    *)         echo 'Many such processes'
esac

Esse script sh usa a única matriz à qual temos acesso, que é a matriz de parâmetros posicionais. Esses (os parâmetros posicionais) são definidos para os PIDs gerados por pgrep com set e o número deles é obtido de $# .

    
por 23.02.2018 / 14:42

Tags