Testando se um processo está sendo executado via if e -z

2

Eu tenho um processo no meu sistema que é famoso por travar e é um tipo de missão crítica, meu gerente de rede. Em qualquer caso, eu preciso escrever um loop que testa se está em execução e inicia se não for. Foi isso que eu criei até agora:

#!/bin/bash

while [ true ]; do 
    if [ -z $(ps aux | grep "[n]m-applet") ]; then
        echo "Bugger died, resurrecting..."
        nm-applet >/dev/null 2>/dev/null &
        disown $!
    fi

    sleep 3
done 

Infelizmente, isso não está dando certo, já que parece estar iniciando o processo mesmo quando não é necessário, e após a primeira execução, recebo a seguinte saída de erro:

line 4: [: too many arguments

O que estou fazendo de errado aqui?

    
por Naftuli Kay 26.08.2011 / 03:26

3 respostas

9

Tente colocar o $(...) entre aspas duplas:

if [ -z "$(ps aux | grep '[n]m-applet')" ]; then

Mas você pode tentar usar pgrep ou ps axo cmd | grep '[n]m-applet' .

    
por 26.08.2011 / 03:39
6

Esse erro vem de dar vários argumentos para -z. É um operador unário e, se o $() se expandir para algo com o $ IFS, ele verá vários argumentos. Para corrigir isso, você pode colocar aspas em torno dele assim: [ -z "$(ps...)" ] .

Neste caso, você realmente não precisa do teste ( [] ) porque o grep retornará diferente de zero se não encontrar nada. Você pode fazer:

if ps aux | grep '[n]m-applet' > /dev/null; then

E você pode querer ver se os sistemas que você planeja implantar isso têm pgrep . É feito para procurar processos que correspondam a um padrão.

Além disso, você pode querer que o script não segure em segundo plano o applet nm. Desta forma, o script irá bloquear até que o nm-applet morra.

Finalmente, você pode querer olhar para Monit , que é feito para fazer o que seu script faz.

    
por 26.08.2011 / 03:46
3

Não tenho certeza sobre seus motivos para while [ true ]; do e segundo Sugestão do Arcege para usar pgrep .

#!/bin/bash
while true; do 
    if ! pgrep nmapplet &>/dev/null; then
       echo "Bugger died, resurrecting..."
       nm-applet &>/dev/null
       disown $!
    fi
    sleep 3
done
    
por 26.08.2011 / 03:52

Tags