Correspondendo a nomes de programas, por que tantos acessos?

0

Na minha caixa, o código /bin/ps -aux | /bin/grep -c "blynk" retorna um 1 porque o servidor blynk não está em execução.

No entanto, quando o mesmo código é executado em um arquivo bash, ele retorna 4. Como isso acontece?

#!/bin/sh
stat='/bin/ps -aux | /bin/grep -c "blynk"'
if [ $stat -lt "2" ]; then
    echo not running
else 
    echo running
    date
fi
    
por Emilio 14.01.2018 / 16:13

3 respostas

0

Você recebe um número maior do grep porque há mais programas em execução que correspondem ao padrão.

Se você observar a saída de grep (sem o -c ), verá quais linhas na saída de ps correspondem. Por exemplo. se eu fizer um script como esse, recebo três:

$ cat check_blynk.sh
#!/bin/bash
foo=$(/bin/ps a | /bin/grep "blynk")
echo "$foo"

$ bash check_blynk.sh
28874 pts/11   S+     0:00 bash check_blynk.sh
28875 pts/11   S+     0:00 bash check_blynk.sh
28877 pts/11   S+     0:00 /bin/grep blynk

Esse é um para o grep , pois o padrão que ele usa corresponde a si mesmo, um para o script que por acaso contém a mesma palavra em seu nome e outro para o fato de que a ps | grep está sendo executado em um subshell, ou seja, outra cópia do shell. (Eu não tenho certeza do que o quarto seria.)

Você pode querer usar algo como pgrep -c blynk , assumindo que blynk é o nome do arquivo de programa. Por padrão, pgrep verifica o nome real do arquivo do programa em execução, em vez da linha de comando inteira. (Com -f verifica a linha de comando, mas você vai corresponder ao script Bash novamente)

    
por 14.01.2018 / 16:33
0

Você precisa impedir que grep encontre a si mesmo. Uma maneira fácil de fazer isso é isso:

/bin/ps -aux | /bin/grep -c "[b]lynk"

Dessa forma, grep procura por blynk sem tê-lo em sua linha de comando. Ou você evita que grep seja executado ao mesmo tempo:

/bin/ps -aux >ps.txt
/bin/grep -c "[b]lynk" ps.txt

Naturalmente, faz sentido não direcionar as linhas de comando, pois você também encontrará editores que foram abertos com um arquivo README.blynk .

Assim, é melhor usar pgrep ou modificar a saída ps , limitá-la a nomes de comando ou caminhos de comando.

    
por 14.01.2018 / 16:49
0

Uma função bash para verificar se um processo de um comando está sendo executado, extinto (zumbi, morto) excluído:

_isRunning() {
    ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

Observação: ps informa também processos defuntos, portanto, grep -x é usado

Exemplos de uso:

if _isRunning blynk; then
  echo not running
else 
  echo running
  date
fi
    
por 18.01.2018 / 06:29