Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diego Macêdo

Monitoramente de processos

Recommended Posts

Amigos,

 

poderiam me indicar algum programa que eu poderia instalar em meu servidor web, para fazer o monitoramento de alguns processos, onde eu apenas informe ao programa o comando de execução dele, caso o processo "caia" ele ative-o novamente rodando aquele devido comando?

 

Servidor CentOS

 

Deu pra entender? :P

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ninguém sabe me informar um software para monitoramento de processos/serviços de um servidor linux? http://forum.imasters.com.br/public/style_emoticons/default/upset.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei um código que faz isso, mas preciso de umas modificações nele:

#!/bin/bash

#Criado por Maurilio Alberone em 30/06/2008 - maurilio@peta5.com.br
#Script para verificar se determinados processos estão em execução no seu servidor.
#Os processos a serem monitorados devem ser passados como parâmetro no momento de execução deste script, entre aspas e separados por espaço.
#Por exemplo:
#./monitora-processos.sh "apache2" "squid" "dhcpd"

#Verifica se o arquivo temporário existe e o remove.
if [ -e /tmp/processos.tmp ]; then
rm /tmp/processos.tmp
fi

#Cria os diretórios para armazenamento do log
mkdir /srv/processos/$(date +%Y)
mkdir /srv/processos/$(date +%Y)/$(date +%m)

#Executa para cada processo passado como parâmetro.
for i in "$@"; do

   #Executa o comando ps para todos os usuários e filtra com o grep o processo monitorado, depois são executados filtros inversos para excluir
   #aparições da execução do próprio grep e do nosso script. O resultado, se existir, é salvo em um arquivo temporário.
   ps aux | grep "$i" | grep -v "grep" | grep -v "monitora-processos.sh" > /tmp/processos.tmp

   #Calcula-se o número de linhas do arquivo criado acima e atribui esse valor à variável A.
   A=$(wc -l /tmp/processos.tmp | awk '{print $1}')
   
   #Se A é maior ou igual a 1 significa que o processo está em execução,
   #então é salva uma linha contendo um OK para o processo monitorado naquele momento.
   #Senão é salvo um ERRO no log e tembém é enviado um email para o administrador do sistema avisando do ocorrido.
   if [ $A -ge 1 ]; then
      echo -e "$i\tOK\t$(date +"%x\t%X")" >> /srv/processos/$(date +%Y)/$(date +%m)/$(date +%d).log
   else
      echo -e "$i\tERRO\t$(date +"%x\t%X")" >> /srv/processos/$(date +%Y)/$(date +%m)/$(date +%d).log
      echo -e "\nPor algum motivo inesperado o processo $i não está sendo executado neste momento." | mutt -s "[ALERTA] Problemas com $i em $(date +"%x  %X")" email@dominio.com.br -a  /tmp/processos.tmp
   fi
   
done

Preciso que em vez de passar como parâmetro o nome do processo, eu passe pra ele um comando de execução, pois eu preciso disso pra monitorar os processos do ShoutCast, onde os comandos seriam como exemplo os abaixo:

./sc_serv serv_8110.conf
./sc_trans_linux trans_8110.conf

./sc_serv serv_8112.conf
./sc_trans_linux trans_8112.conf

./sc_serv serv_8114.conf
./sc_trans_linux trans_8114.conf

etc...

Caso algum dos processos sejam finalizados (seja lá qual for o motivo), eles sejam executados novamente. Poderia utilizar um cronjob pra verificar a cada 15min por exemplo.

 

Aguardo uma ajuda! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei um script que realmente faz o monitoramento do shoutcast, mas alguém poderia me explicar o código pra que eu possa fazer algumas modificações ou até mesmo me ajudar a fazer as modificações para ele verificar não só um processo, mas sim 2..3..etc...

 

#!/bin/bash
### Script to restart shoutcast server/transcoder when it's down
### Imtiaz a Khan http://www.netbrix.net on 21 May 2007

prcs=`ps -ef | grep “sc_serv\|sc_trans” | grep -v grep > /tmp/monitor.log && cat /tmp/monitor.log | tr -s ” ” | cut -d” ” -f2,8 | grep -v grep | wc -l`
if [ ! $prcs ] || [ $prcs -lt 4 ]
then
/usr/bin/killall sc_trans_linux
/usr/bin/killall sc_serv
nohup sc_serv &
nohup sc_serv sc_serv_low.conf &
cd sc_trans_040
make_playlist
nohup sc_trans_linux &
nohup sc_trans_linux sc_trans_low.conf &

###Send out the mails to inform
echo “shoutcast services restarted at `date`”| mail -s “ALARM: shoutcast services on `hostname`” khanimtiaz@gmail.com
#echo “shoutcast services restarted at `date`”| mail -s “ALARM: shoutcast services on `hostname`” youremailid
else
echo “shoutcast services running fine on `date`”| mail -s “OK: shoutcast services on `hostname`” khanimtiaz@gmail.com
#echo “shoutcast services running fine on `date`”| mail -s “OK: shoutcast services on `hostname`” youremailid
fi 

o shoutcast está no diretório: /home/shoutcast/

o transcoder está na pasta: /home/shoutcast/trans/

 

ficaria algo assim pra executar cada servidor:

cd /home/shoutcast/
./sc_serv serv_8110.conf
cd trans
./sc_trans_linux trans_8110.conf

assim serveria para o 8112...8114 (onde esses números indicam as portas de conexão deles, pois é através das portas que eu sei quem é o cliente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ps -ef => lista todos os processos em execução

| => pipeline

grep => retorna as linhas que casaram com a expressão regular

grep -v => retorna todas as linhas que não casaram com a expressão regular

> => redireciona output

> /tmp/monitor.log => redireciona o output para o arquivo /tmp/monitor.log

cat => pega conteudo de um arquivo

tr -s " " => vai trocar multiplas ocorrencias do caracter espaço por apenas 1

cut -d" " -f2,8 => vai cortar a string pelos espaços e pegar a range de 2 a 8 do que foi cortado

wc -l => conta as linhas

 

Se prcs for menor que 4,vai finalizar os processos sc_trans_linux e sc_serv.

Vai rodar os comandos sc_serv ignorando pedidos de input e mandando o output para o arquivo nohup.out.Vai abrir a pasta sc_trans_040.Vai rodar o comando make_playlist

Vai rodar os comando sc_trans_linux ignorando pedidos de input e mandando o output para o arquivo nohup.out.Vai enviar um email avisando o que ocorreu.

Básicamente checa se os processos tão rodando,se não,inicia eles.

---

Um exemplo tosco que eu fiz:

#!/bin/bash

if [ $# -ne 2 ]
then
    printf 'Usagem: %s nome_processo comando_reiniciar\n' $0
    exit
fi

if [ $(ps -ef | grep -i "$1" | wc -l) -gt 3 ]
then
    echo 'Processo em execucao'
else
    echo 'Reiniciando processo...aguarde.'
    echo $2 | sh > "${1}_reiniciar.log"
    printf 'Log do comando de reiniciar:%s_reiniciar.log\n' $1
fi

E mal ter explicado tao pessimamente...=/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teria como fazer um script bem simples mesmo.. do tipo que verificasse se o processo sc_serv com o arquivo de configuração específico está rodando.

 

Vou resumir aqui:

SE ./sc_serv 8110_trans.conf
(faz nada)
CASO CONTRÁRIO
executa ./sc_serv 8110_trans.conf

Não pode ser só verificar o sc_serv pois eu tenho vários processos dele rodando com vários arquivos de config diferentes, como eu disse no meu post anterior.

 

Se tiver como fazer esse tipo de verificação do processo com o arquivo de configuração específico, resolve o meu problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tendo salvo meu script como 'recuperador.sh',eis um exemplo:

sh recuperador.sh 'sc_serv' 'cd caminhoDoArquivo;./sc_serv 8110_trans.conf'
E se são vários com o mesmo nome,fica mais complicadinho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seriam esses aplicativos aqui:

(radio 1)
cd /home/shoutcast/
./sc_serv serv_8110.conf
cd trans
./sc_trans_linux trans_8110.conf

(radio 2)
cd /home/shoutcast/
./sc_serv serv_8112.conf
cd trans
./sc_trans_linux trans_8112.conf

(radio n)
etc...

deu pra entender?

 

Eu queria montar um arquivo q mesmo q eu fosse la manualmente adicionar as linhas pra cada vez q eu precisar de uma rádio eu pudesse editar.. mas q esse script sempre verificasse se os comandos q deveriam estar rodando.. estão rodando!

 

deu pra entender?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi.Mas ai fica mais complicadinho pro seu lado.

Voce poderia por o nome dos programas que devem estar rodando,e suas configurações em um array,e ir rodando meu script em cima dos nomes.

Exemplo de checar um processo em cima de um arquivo de configuração:

sh recuperador.sh 'sc_serv serv_8110.conf' 'cd caminhoDoArquivo;./sc_serv 8110_trans.conf'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu estava querendo deixar apenas em um arquivo de programa, pq eu só precisaria editá-lo quando fosse necessário adicionar ou remover algum processo. Daí, eu iria configurar o crontab para ficar executando a verificação a cada 15 min, por exemplo.

 

Aí ele iria pegar o script que verifica juntamente com a lista de processos que devem estar rodando e verificar se ta tudo ok.

 

Com esse seu script e através desses comando de verificação, dá pra fazer isso com o crontab? pois qualquer coisa eu posso criar um crontab pra cada comando desse tb, daria no mesmo.

 

EDIT - Posta aqui esse script recuperador.sh

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um amigo meu fez um scriptzinhu pra mim e funcionou perfeitamente para rodar as rádios!

 

Veja o script:

radio.sh

#!/bin/sh

PORTAS="8110 8112 8114"

# nao alterar a partir daqui
for PORTA in $PORTAS
do
        VAR=`ps aux | grep "sc_serv $PORTA.conf" | wc -l`

        echo -n "Shoutcast na $PORTA: "
        if [ $VAR -eq 2 ]; then
                echo "OK"
        else
                echo "OFF"
                date
                echo "- Colocando para rodar..."
                cd /home/shoutcast/
                ./sc_serv $PORTA.conf > /var/log/shoutcast.log &
        fi
        echo ""
done

Copiei o mesmo código e só modifiquei o comando e estou tendo problemas com uma multiplicação dos processos.

Ele roda vários processos iguais "./sc_autodj 8110.adj" e tbm com os outros de portas diferentes.

autodj.sh

#!/bin/sh

PORTAS="8110 8112"

# nao alterar a partir daqui
for PORTA in $PORTAS
do
        VAR=`ps aux | grep "sc_autodj $PORTA.adj" | wc -l`

        echo -n "Auto-DJ na porta $PORTA: "
        if [ $VAR -eq 2 ]; then
                echo "OK"
        else
                echo "OFF"
                date
                echo "- Colocando para rodar..."
                cd /home/shoutcast/
                ./sc_autodj $PORTA.adj > /var/log/shoutcast.log &
        fi
        echo ""
done

Ele roda os 2 script a cada 20 minutos, para que eles verifiquem se as rádios e autodjs estão funcionando perfeitamente. Se não estiverem, ele executa novamente:

0,20,40 * * * * /home/shoutcast/radio.sh > /dev/null 2>&1
0,20,40 * * * * /home/shoutcast/autodj.sh > /dev/null 2>&1

Por algum motivo ele ta executando os "autodj" novamente, mesmo eles funcionando.

 

Alguém saberia me dizer o que poderia ser?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não te respondi de novo porque você não prestou atenção nos meus posts.

Eu fiz um script de exemplo para você,e ainda te dei um exemplo de como usar (veja acima).

Nesse caso,não é muito interessante usar uma condição de igualdade (-eq).Se o(s) processo(s) existir(em),existirão 3 outros processos com o que você quer em algum lugar (caso usado aquele comando para checar) e o(s) processo(s).Sendo assim,você pode trocar o -eq 2 por -gt 3 por exemplo (como eu fiz).

Espero que tenha entendido!

---

y -gt x -> y greater than (maior que) x?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O nome do programa é igual, mas o arquivo de configuração que é utilizado com ele é diferente.

 

Atualmente o script da rádio funciona perfeitamente, sem duplicar. Só estão sendo duplicados os AutoDJ.

 

PROCESSOS DAS RÁDIOS:

./sc_serv 8110.conf
./sc_serv 8112.conf
./sc_serv 8114.conf

PROCESSOS DOS AUTODJS:

./sc_autodj 8110.adj
./sc_autodj 8110.adj
./sc_autodj 8110.adj
./sc_autodj 8110.adj
./sc_autodj 8110.adj
./sc_autodj 8110.adj
./sc_autodj 8110.adj
./sc_autodj 8110.adj
./sc_autodj 8110.adj
./sc_autodj 8110.adj
./sc_autodj 8110.adj
./sc_autodj 8110.adj
./sc_autodj 8112.adj
./sc_autodj 8112.adj
./sc_autodj 8112.adj
./sc_autodj 8112.adj
./sc_autodj 8112.adj
./sc_autodj 8112.adj
./sc_autodj 8112.adj
./sc_autodj 8112.adj
./sc_autodj 8112.adj
./sc_autodj 8112.adj
etc...

PROCESSOS DOS AUTODJS DEVERIAM SER ASSIM:

./sc_autodj 8110.adj
./sc_autodj 8112.adj

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei o seu script:

#!/bin/bash

if [ $# -ne 2 ]
then
    printf 'Usagem: %s nome_processo comando_reiniciar\n' $0
    exit
fi

if [ $(ps -ef | grep -i "$1" | wc -l) -gt 3 ]
then
    echo 'Processo em execucao'
else
    echo 'Reiniciando processo...aguarde.'
    echo $2 | sh > "${1}_reiniciar.log"
    printf 'Log do comando de reiniciar:%s_reiniciar.log\n' $1
fi

Recebi o erro seguinte ao tentar utilizar:

[root@servidor4 shoutcast]# sh recuperador.sh 'sc_serv' './sc_serv 8110.conf'
recuperador.sh: line 1: f: command not found
recuperador.sh: line 2: syntax error near unexpected token `then'
recuperador.sh: line 2: `then'

Como poderia ficar o seu código adaptado nesse do meu amigo?

 

O interessante é que com as rádios, ele funciona perfeitamente, mas no programa de AUTODJ ele está sendo duplicado. :wacko:

 

Abraços e obg pela paciência...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja todos os exemplos de uso.E para meu script funcionar ai,troque:

#!/bin/bash
Por:

#!/bin/sh
A segunda dúvida foi respondida em posts anteriores,favor prestar mais atenção.De qualquer modo,o script do seu amigo ficaria:

#!/bin/sh

PORTAS="8110 8112"

# nao alterar a partir daqui
for PORTA in $PORTAS
do
        VAR=`ps aux | grep "sc_autodj $PORTA.adj" | wc -l`

        echo -n "Auto-DJ na porta $PORTA: "
        if [ $VAR -gt 3 ]; then
                echo "OK"
        else
                echo "OFF"
                date
                echo "- Colocando para rodar..."
                cd /home/shoutcast/
                ./sc_autodj $PORTA.adj > /var/log/shoutcast.log &
        fi
        echo ""
done

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.