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'
.
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?
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.
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
Tags bash