Identificando e manipulando processos

1. Identificando e manipulando processos

Juda Benhur
paulistinha

(usa Red Hat)

Enviado em 05/08/2009 - 03:28h

Pessoal,

Minha pergunta pode parecer ridícula, mas minha dificuldade em programação é grande.

Tenho em meu servidor linux, diversos processos de um mesmo serviço, em instances diferentes. O que preciso, é identificar uma determinanda instance deste serviço, parar ou matar o processo e reinicia-lo.

Tentei criar um script para essa finalidade, mas fracassei em todas as tentativas.

Para ilustrar minha necessidade, segue o exemplo:

OpenVPN
* Cria-se 4 vpn's, cada uma executa o comando "/usr/sbin/openvpn" seguido do respectivo arquivo de configuração, assim, temos:

/usr/sbin/openvpn --config /etc/openvpn/parana.conf --daemon
/usr/sbin/openvpn --config /etc/openvpn/riodejaneiro.conf --daemon
/usr/sbin/openvpn --config /etc/openvpn/minasgerais.conf --daemon
/usr/sbin/openvpn --config /etc/openvpn/matogrosso.conf --daemon

e consequentemente, ao rodar um "ps xa | grep openvpn",

15692 ? Ss 0:06 /usr/sbin/openvpn --config /etc/openvpn/riodejaneiro.conf --daemon
25694 ? Ss 304:23 /usr/sbin/openvpn --config /etc/openvpn/matogrosso.conf --daemon
25721 ? Ss 0:14 /usr/sbin/openvpn --config /etc/openvpn/minasgerais.conf --daemon
25730 ? Ss 1:01 /usr/sbin/openvpn --config /etc/openvpn/parana.conf --daemon

Então, caso eu realize alguma alteração na configuração e/ou precise reiniciar somente uma única instance do openvpn, preciso identificar qual é o número do processo, matar esse processo e executá-lo novamente. Manualmente, seria assim:

# ps xa | grep parana
25730 ? Ss 1:01 /usr/sbin/openvpn --config /etc/openvpn/parana.conf --daemon
# kill -9 25730
# /usr/sbin/openvpn --config /etc/openvpn/parana.conf --daemon


Como posso melhorar esse procedimento, criando um script para essa finalidade?

Assim como o openvpn, tenho diversos outros serviços com a mesma característica e necessidade, pois, se executar o comando padrão (# /etc/rc.d/init/d/openvpn restart), não irá contemplar a desejada finalidade.


Muito obrigado pela ajuda e, desculpe-me qualquer coisa.

Grato,
Benhur.




  


2. Re: Identificando e manipulando processos

Cloves Pereira Costa Jr
clovesjr

(usa Slackware)

Enviado em 05/08/2009 - 09:47h

Cara...

tenho um script que tá fazendo quase tudo o que vc quer...

vou adaptar ele e daqui a pouco te envio...

[]s


Cloves Jr


3. Script

Cloves Pereira Costa Jr
clovesjr

(usa Slackware)

Enviado em 05/08/2009 - 10:47h

Olha só...

Testa o script abaixo...

A única coisa é que não sei como vc faz para iniciar os processos...

Me passa como vc faz para iniciar os processos que te passo onde vc tem que alterar para funcionar corretamente...

#########################################

#!/bin/sh

# Script para dar manutencao do OpenVPN
# Criado por Cloves Pereira Costa Jr
# 05/08/2009

ok="N"
processos=`ps xa | grep openvpn | grep -v grep`
parametro1="$1"
parametro2="$2"

usage_message(){
echo
echo -e "\tÉ necessário passar ao menos um parâmetro"
echo -e "\t$0 <parametro1> <parametro2>"
echo
echo -e "\t<parametro1>"
echo
echo -e "\t\tstop"
echo -e "\t\tforcestop"
echo -e "\t\tstart"
echo -e "\t\trestart"

echo
echo -e "\t<parametro2>"
echo
echo -e "\t\tparana"
echo -e "\t\triodejaneiro"
echo -e "\t\tminasgerais"
echo -e "\t\tmatogrosso"
echo
}


pega_pids_global(){
PIDS=`$processos | awk '{print $1}'`
}

pega_pid(){
PID=`$processos | grep $1 | grep -v grep | awk '{print $1}'`
}

do_stop(){
# verifica se foi passado algum parametro
if [ -z $1 ]; then
# se nao foi passado, para todos os processos
for pid in ${PIDS}
do
kill ${pid}
done
else
# se foi passado, para o processo do parametro enviado
pega_pid $1
kill $PID
fi
}

do_forcestop(){
# verifica se foi passado algum parametro
if [ -z $1 ]; then
# se nao foi passado, para todos os processos
for pid in ${PIDS}
do
kill -9 ${pid}
done
else
# se foi passado, para o processo do parametro enviado
pega_pid $1
kill -9 $PID
fi
}

do_start(){
# verifica se foi passado algum parametro
if [ -z $1 ]; then
# se nao foi passado, inicia todos os processos
<comando_start>
else
# se foi passado, inicia o processo do parametro enviado
<comando_start>
fi
}

verifica_parametro2(){
case $parametro2 in
"parana")
ok="S"
;;
"riodejaneiro")
ok="S"
;;
"minasgerais")
ok="S"
;;
"matogrosso")
ok="S"
;;
*)
ok="N"
;;
esac
}

# verifica se foi passado o primeiro parametro
if [ -z $parametro1 ]; then
# se não foi passado, mostra a mensagem de uso do programa
usage_message
exit 0
else
# verifica se foi passado o segundo parametro
if [ -z $parametro2 ]; then
# se não foi passado, age como comando global valendo para todos os servicos abertos
pega_pids_global
case "$parametro1" in
"stop")
do_stop
;;
"forcestop")
do_forcestop
;;
"start")
do_start
;;
"restart")
do_stop
do_start
;;
*)
usage_message
exit 0
;;
esac
else
# se foi passado, age baseado no segundo parametro
verifica_parametro2
if [ $ok == "S" ]; then
case "$parametro1" in
"stop")
do_stop $parametro2
;;
"forcestop")
do_forcestop $parametro2
;;
"start")
do_start $parametro2
;;
"restart")
do_stop $parametro2
do_start $parametro2
;;
*)
usage_message
exit 0
;;
esac
else
usage_message
exit 0
fi
fi
fi

#########################################


4. Re: Identificando e manipulando processos

Juda Benhur
paulistinha

(usa Red Hat)

Enviado em 06/08/2009 - 03:34h

Entao Cloves,

Eu inicio o serviço, da forma que coloquei acima mesmo....

/usr/sbin/openvpn --config /etc/openvpn/parana.conf --daemon

Esse comando acima é um exemplo prático.

Há também, a necessidade de rodar o dhcp, individualmente para cada placa de rede, pois a intensão nesse caso, seria garantir que cada range ficaria naquela interface/placa especícifica (tenho de 4 a 6 placas de rede em cada firewall de unidade remota, segmentando a rede).

Desta forma, se conseguisse resolver a questão para o openvpn (tenho 8 vpns remotas),, seria facil resolver para o dhcp e outros serviços que muitos de nós precisamos executar individual ou separadamente.