Diego Macêdo 6 Denunciar post Postado Julho 31, 2009 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
Diego Macêdo 6 Denunciar post Postado Agosto 13, 2009 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
Diego Macêdo 6 Denunciar post Postado Agosto 13, 2009 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
Diego Macêdo 6 Denunciar post Postado Agosto 13, 2009 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
eibon 2 Denunciar post Postado Agosto 17, 2009 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
Diego Macêdo 6 Denunciar post Postado Agosto 17, 2009 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
eibon 2 Denunciar post Postado Agosto 17, 2009 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
Diego Macêdo 6 Denunciar post Postado Agosto 17, 2009 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
eibon 2 Denunciar post Postado Agosto 17, 2009 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
Diego Macêdo 6 Denunciar post Postado Agosto 17, 2009 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
Diego Macêdo 6 Denunciar post Postado Agosto 24, 2009 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
eibon 2 Denunciar post Postado Agosto 25, 2009 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
Diego Macêdo 6 Denunciar post Postado Agosto 25, 2009 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
eibon 2 Denunciar post Postado Agosto 25, 2009 Você alterou o que eu falei e mesmo assim acontece isso? Estranho cara... Compartilhar este post Link para o post Compartilhar em outros sites
Diego Macêdo 6 Denunciar post Postado Agosto 25, 2009 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
eibon 2 Denunciar post Postado Agosto 25, 2009 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