Monitora um processo no Debian

5

Eu quero criar um serviço que monitore a existência de um determinado processo. Eu escrevi o seguinte script de shell:

#!/bin/sh
while :
do
w='ps u -A | grep -P ".+Sl.+/usr/local/MySource/endpoint" -c'
sleep 10
if [ $w -lt 2 ] 
then
echo 0 > /sys/class/leds/alix\:2/brightness
killall -9 /usr/local/MySource/endpoint
nohup /usr/local/MySource/endpoint &> /dev/null &
last_endpoint_m='date'
echo $last_endpoint_m > /tmp/endpoint_msleep
echo $w >> /tmp/endpoint_msleep
else
echo 1 > /sys/class/leds/alix\:2/brightness
fi
sleep 10
done

Se o processo existir, o script desligará um LED na minha máquina e iniciará o processo. O LED deve ser ON enquanto o processo está sendo executado.

Eu, então, executo este script adicionando a seguinte linha a /etc/rc.local :

nohup /usr/local/MyTools/additions/XR50_endpoint_m &> /dev/null &

Quando executo ps , descubro que o processo XR50_endpoint_m & está lá.

Meu computador é uma placa ALIX com recursos limitados (incorporados) que executam o Debian.

A questão é:
A variável $w é sempre zero (verifiquei isso no arquivo de saída /tmp/endpoint_msleep ). Embora o processo exista e o script esteja funcionando bem, se eu o executar manualmente ( $w=2 )!

O que você acha que é o motivo e qual é a melhor maneira de monitorar um processo?

    
por abahnihi 27.08.2013 / 18:42

1 resposta

5

Está falhando porque você executa ps u . De man ps :

u Exibe o formato orientado ao usuário.

Isso significa que ps listará apenas processos de propriedade do usuário atual. Quando você executa o script manualmente, esse usuário é você para que seu processo seja listado corretamente.

(Como @Gilles apontou muito corretamente, o uso de -A fará com que todos os processos sejam impressos de modo que a explicação esteja errada. pgrep ainda é melhor).

De qualquer forma, uma maneira melhor de fazer isso seria usar pgrep :

   pgrep,  pkill  - look up or signal processes based on
   name and other attributes

Alterar

w='ps u -A | grep -P ".+Sl.+/usr/local/MySource/endpoint" -c' 

para

w='pgrep -c endpoint'
    
por 27.08.2013 / 19:00