Jump to content
diokhan

kill process

Recommended Posts

diokhan

Boas,

eu preciso de fazer uma alteração num script que tenho em python, basicamente o script serve para verificar se os meus sites estão online ou offline, ate aqui esta a funcionar.

o que gostaria de implementar era, caso os sites estejam offline, queria fazer um shutdow ao tomcat (com "su tomcat"), um kill ao tomcat (pelo "sudo kill -9 PID"), e depois um start ao tomcat (pelo "su tomcat").

mas todos tem passwords, há alguma forma de o fazer sem usar as passwords ou algum metodo de usar a password mas sem ser possível os utilizadores verem a password? 🤔


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
NuGuN

Boas!

Bem, parece-me que a solução para o que queres não passa pelo script em python.

Estás a utilizar o crond para correr o script? Ou como é que estás a fazer?

Uma forma que tens para fazer isso é utilizando o 'sudo'. Editas o '/etc/sudoers' manualmente ou com o editor e adicionas uma entrada onde dás permissões a um utilizador para executar esse script sem pedir password. Esse utilizador tem de ser o utilizador com o qual tens login feito.

Depois para executares o script fazes 'sudo /path/do/script'

Cumps!

Share this post


Link to post
Share on other sites
diokhan

eu encontrei uma solução, ou uma possível solução, deixei durante o fim de semana para ver se funciona, caso o tomcat vá abaixo o script deve reiniciar.

o script que tenho onde verifica se os sites estao online é um cron job, e nem eu e nem o meu chefe queremos colocar o utilizador tomcat nos sudoers, por isso eu arranjei uma soluçao mais ou menos assim:

como o cron é corrido pelo root, escrevi um ficheiro onde tem a password, mas as permissões desse ficheiro é apenas de leitura para o owner root, também o group como o other não tem permissão para nada, assim no meu script executo os comandos necessaros pelo python com o os.system() e sei que uso um outro qual não lembro o nome agora, e quando preciso da password vou ao ficheiro buscar. pode não ser a melhor solução mas foi uma ideia que surgiu e decidi experimentar.

mas desde já agradeço a ajuda :cheesygrin:


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
NuGuN

Então não estou a perceber uma coisa. Se estás a utilizar o cron e se estás a executar a tarefa como root, o teu script vai ser executado com privilegios de root. E sendo assim, não precisas do 'su' para executar o comando 'kill -9 PID' e consequentemente também não vais precisar de nenhuma password.

Ou está-me a escapar alguma coisa?

Já agora, adicionar o utilizador 'tomcat' ao sudoers não tem problema, uma vez que estarias a dar-lhe permissões apenas para executar aquele comando especifico. Terias sim de ter cuidado com as permissões do ficheiro do script para n chegar la um utilizador normal e alterar o script à sua vontade, tal como também tens de ter com o cron uma vez que o estás a executar com altos privilegios.

Cumps!

Share this post


Link to post
Share on other sites
diokhan

eu preciso da password para o utilizador tomcat, para o su nao é necessario, o meu chefe diz que nao quer colocar o tomcat no sudoers, como é ele que manda no servidor nao posso fazer nada, no script ninguem consegue mexer, alem de estar numa pasta com nenhuma permissao para fora do grupo o proprio ficheiro do script so é permitido editar ou ver o dono do ficheiro


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
NuGuN

Se o chefe não quer... Ele é que manda  :)

Ah ok, pro 'tomcat'. Quando li o teu primeiro post não reparei que estavas a iniciar o tomcat com esse utilizador.

Então diz-me uma coisa, tu estas a fazer 'su tomcat' e depois das o comando para iniciar o tomcat. Certo?

Cumps!

Share this post


Link to post
Share on other sites
diokhan

sim, eu faço su tomcat e dou logo o comando, primeiro para fazer um shutdown e depois para fazer um start ao tomcat, entre o shutdown e o start eu faço uma verificação se o tomcat foi mesmo parado ou não, caso não foi parado faço um kill -9 ao tomcat e depois inicio


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
NuGuN

Então, caso não tenhas feito ainda, experimenta a procurar na pasta '/etc/default' pelo ficheiro do tomcat. Deve ter um nome identico. Nesse ficheiro estou certo que podes escolher o utilizador ao qual o serviço vai pertencer.

No caso do Debian, mesmo que fexecute como root o comando 'invoke-rc.d tomcat start', ele vai pertencer ao utilizador 'tomcat'. E assim deixavas de precisar da password.

Então o como fizeste, resultou?

Cumps!

Share this post


Link to post
Share on other sites
diokhan

funcionou mais ou menos, ele faz o shutdown, mas depois nao faz o kill -9 e nao faz o startup do tomcat, vou ver a tua ideia e ja digo algo  :)


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

não pude fazer o que referis-te, o meu chefe não quer que eu altere o conteúdo do ficheiro. na pasta só havia 2 ficheiros e o que preciso alterar é ficheiro do root e ele não quer que seja alterado

:)


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
NuGuN

Ah ele também não quer que alteres isso?lol Então assim é difícil...

Diz-me uma coisa, consegues ver o porquê de não te fazer o kill e o startup?

Dá para meteres aqui o script que tens, a tarefa que tens no cron e a distro que usas? Era mais fácil.

Cumps!

Share this post


Link to post
Share on other sites
diokhan

o script que tenho é este, com ligeiras alterações por causa dos emails e dos sites que estão no meu script:

import os
import sys
import pexpect

def grep():
        grep = os.system("ps -aux | egrep '^tomcat' > /tmp/resultTomcat.txt")
        awk = os.system("awk '{print $2}' /tmp/result.txt > /tmp/resultTomcat1.txt")
       
        file = open("/tmp/resultTomcat1.txt", "r") ## open file in read mode
        uid = file.read() ## get value from file
        file.close() ## close file
       
        rm = os.system("rm /tmp/resultTomcat.txt")
        rm = os.system("rm /tmp/resultTomcat1.txt")
       
        if (uid != ""):
                return str(uid)
        else:
                return str(0)

def restartTomcat():       
        file = open("/home/Software/checkPages/password.txt", "r") ## open file in read mode
        password = file.read() ## get value from file
        file.close() ## close file
       
        p = pexpect.spawn("su tomcat /home/Software/apache-tomcat-6.0.20/bin/shutdown.sh")
        p.logfile = sys.stdout
        p.expect('Password:')
        p.sendline(str(password))

        uid = grep()
        if (uid != 0):
                kill = os.system("kill -9 " + uid)

        p = pexpect.spawn("su tomcat /home/Software/apache-tomcat-6.0.20/bin/startup.sh")
        p.logfile = sys.stdout
        p.expect('Password:')
        p.sendline(str(password))

        uid2 = grep()
        if (uid2 != 0):
                return str(uid2)  
        else:
                return str(0)  
       

## send email
def sendEMail(fromaddr, toAddrs, msg, subj):
        sendmail_location = "/usr/sbin/sendmail" # sendmail location
        p = os.popen("%s -t" % sendmail_location, "w")
        p.write("From: %s\n" % fromaddr) # from:
        p.write("To: %s\n" % toAddrs) # to:
        p.write("Subject: %s\n" % subj) # subject
        p.write("\n") # blank line separating headers from body
        p.write(msg) # send email
        status = p.close()

## checks the percentage of usage in tomcat server
## return message and subject to send email
def checkPer(valuePer):

        grep = os.system("ps -aux | egrep '^tomcat' > /tmp/result.txt")
        awk = os.system("awk '{print $4}' /tmp/result.txt > /tmp/result1.txt")

        file = open("/tmp/result1.txt", "r") ## open file in read mode
        fPercent = file.read() ## get value from file
        file.close() ## close file

        rm = os.system("rm /tmp/result.txt")
        rm = os.system("rm /tmp/result1.txt")
        return (float(fPercent))

## check if sites is online
## principal process
def checkPages(valuePer, sites):
        fromaddr = 'sitesAdmin@teste.pt'
        toaddrs  = ['email1@teste.pt', 'email2@teste.pt']

        fPercent = checkPer(valuePer)
        os.system("echo Tomcat Memory: " + str(fPercent) + "% >> /var/log/checkPages.log" )
       
        if (fPercent > valuePer):
                for j in range(len(toaddrs)):
                        toAddrs = toaddrs[j]
                        sendEMail(fromaddr, toAddrs, "Tomcat Memory higher than: %f%% (%f%%)" % (valuePer, fPercent), "Tomcat Memory")

        message = "Page offline\n"
        for i in range(len(sites)):
                ## do wget for all sites
               
                error = os.system("wget -O /tmp/index.html "+ sites[i])
                if (error != 0):
                        ## if error different to 0, send email, page offline
                        os.system("echo Site Offline " + str(sites[i]) + " >> /var/log/checkPages.log")
                       
                        message += sites[i]+"\n"
                       
                        ##for j in range(len(toaddrs)):
                        ##        toAddrs = toaddrs[j]
                        ##        sendEMail(fromaddr, toAddrs, "Page offline " + sites[i], "Page offline")

                else:
                            ## if error equal to 0, write in log file, page online
                        os.system("echo Site Online " + str(sites[i]) + " >> /var/log/checkPages.log")
                        rm = os.system("rm /tmp/index.html")

        if (error != 0):
                  uid = restartTomcat()
                  if (uid != str(0)):
                          message += "\nTomcat restart successfully!\n"
                  else:
                          message += "\nTomcat not restart successfully!\n"
                 
                  for j in range(len(toaddrs)):
                         toAddrs = toaddrs[j]
                         sendEMail(fromaddr, toAddrs, message, "Page offline")
                

if __name__ == "__main__":
        sites = ['http://google.pt', 'http://exemplo.pt', 'http://www.portugal-a-programar.org/forum/']
        valuePer = 20.0
        checkPages(valuePer, sites)
        os.system("echo >> /var/log/checkPages.log" )

basicamente, o script verifica se as paginas estão online e se o tomcat esta com o processo superior a 20%, caso esteja com o processo superior a 20% manda um email a avisar, e se os sites estiverem offline também manda email a avisar.

o objectivo é se os sites estiverem offline o próprio script conseguir reiniciar o tomcat, a distro é fedora 6

desde já agradeço a atenção e a ajuda :thumbsup:

PS: o cron já não lembro a linha que la esta, mas é apenas uma linha que executa este script de hora a hora, e tambem nao consigo ver o porque de nao fazer o kill nem o startup do tomcat :thumbsup:


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
NuGuN

Estive a dar uma vista de olhos e aparentemente está tudo ok... Agora para se perceber o porquê de não fazer o kill e o startuo vais precisar umas alterações.

Estava a pensar o porque do kill não funcionar... O script está a correr com privilegios de root, o comando está bem ok. Das duas uma. Ou a função 'grep()' não está a retornar o PID correcto ou o kill não chega a ser executado por alguma razão.

Faz as seguintes alterações no script:

Tens de adicionar um controlo de erros nas funções, especialmente na 'restartTomcat()'. Quando falo de controlo de erros estou-me a referir ao try: except:

podes meter tipo:

try:

    ...

except Exception, err:

    #Guarda o '$err' num ficheiro em '/var/log/'

    logFile = open('/var/log/tomcat_trace.log', 'a')

    logFile.write(str(err))

    logFile.close()

Assim, se por algum motivo houver um erro nessa função vais poder ver o que se passou e ate pode ser que descubras o porque de não funcionar.

Depois era boa ideia esperares uns segundos entre o shutdown, o kill, e o startup. Porque se por algum motivo o daemon demorar mais um bocado a desligar, vai levar com o kill sem necessidade.

Por último, na função 'restartTomcat()' a seguir à linha:

p = pexpect.spawn("su tomcat /home/Software/apache-tomcat-6.0.20/bin/startup.sh")

Coloca:

logErr = p.readlines()

logFile = open('/var/log/tomcat_startup.log', 'a')

logFile.write(str(logErr))

logFile.close()

Isto é para guardares o resultado do script 'startup.sh'. Vai guardar tanto o stdout como stderr. E assim se nesse script ocorrer algum erro, vais ter forma de ver também.

Depois dessas alterações volta a fazer os testes e verifica a informação que fica nos ficheiros de log ('tomcat_startup.log e tomcat_trace.log) e diz qualquer coisa. Pode ser que assim se perceba o porquê de não funcionar.

Ah... penso que tens de criar o 'tomcat_startup.log' e o 'tomcat_trace.log' à mão porque como os estás a abrir com a flag 'a' não tenho a certesa que ele os cria caso não existam.

Cumps!

Share this post


Link to post
Share on other sites
diokhan

boas,

eu vou alterar o código, e assim que o script for executado eu digo algo se funcionou ou quais os erros. Pois como deves ter reparado ele só entra no restartTomcat() caso as paginas estejam offline.

desde já obrigado pela ajuda e pelas dicas  :thumbsup:


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

este é o log que faz apos o shutdown:

End Of File (EOF) in read_nonblocking(). Exception style platform.
<pexpect.spawn object at 0x2aaaae1da710>
version: 2.3 ($Revision: 399 $)
command: /bin/su
args: ['/bin/su', 'tomcat', '/home/Software/apache-tomcat-6.0.20/bin/shutdown.sh']
searcher: searcher_re:
    0: re.compile("Password:")
buffer (last 100 chars): 
before (last 100 chars):  CATALINA_TMPDIR: /home/Software/apache-tomcat-6.0.20/temp

Using JRE_HOME:       /usr/java/latest


after: <class 'pexpect.EOF'>
match: None
match_index: None
exitstatus: None
flag_eof: True
pid: 18908
child_fd: 3
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: <open file '<stdout>', mode 'w' at 0x2aaaaaae50b8>
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1

pelo que percebi do script, se escreveu no ficheiro log, pelo try...except... então ele não conseguiu fazer o shutdown.

mas o codigo esta correcto, nao percebo o porque de nao ter feito o shutdow

🤔

PS: aumentei a memoria disponível para o tomcat, para ver se evita do tomcat ficar com o processamento muito alto. mas o script continua activo caso os sites fiquem offline


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
NuGuN

Tu nunca testas-te isso em laboratório para ver se estava tudo OK? É que o shutdown.sh não está a funcionar correctamente.

O que é que tens dentro do shutdown.sh?

O que está a acontecer é, o script executa o comando

p = pexpect.spawn("su tomcat /home/Software/apache-tomcat-6.0.20/bin/shutdown.sh")

Mas este nunca chega a pedir a password.

Depois umas linhas a baixo indicas para procurar pela string "Password:", mas ele não vai encontrar essa string porque a password não é pedida e dá esse erro que ficou no ficheiro.

Repara nestas linhas. Foram os ultimos 100 caracteres retornados pelo "su tomcat /home...".

CATALINA_TMPDIR: /home/Software/apache-tomcat-6.0.20/temp

Using JRE_HOME:       /usr/java/latest

Agora das duas uma. Ou por alguma configuração que está feita quando fazes o "su tomcat /home..." ele não te pede password e executa normalmente o comando. Ou então o shutdown.sh não está a funciona e aqueles 100 caracteres são a parte final do erro.

Se quiseres ver toda a informação que o comando retorna, alteras o srcipt.

Adicionas as seguintes linhas depois logo a seguir à execução do shutdown.sh:

logFile = open('/var/log/tomcat_result.log', 'a')
logFile.write(str(p.readlines()))
logFile.close()

E comentas as linhas:

p.expect('Password:')
p.sendline(str(password))

Isto vai guardar o retorno completo do comando. E já agora podes comentar as mesmas linha que estão a seguir à execução do startup.sh para veres se assim funciona. Se funcionar é porque ao fazeres o "su tomcat..." ele não pede password. Isso podem ser várias coisas...

Depois dá noticias  :thumbsup:

P.S.

Convém que a seguir às linhas "p.sendline(str(password))" adiciones "p.close()".

PS: aumentei a memoria disponível para o tomcat, para ver se evita do tomcat ficar com o processamento muito alto. mas o script continua activo caso os sites fiquem offline

Possivelmente só vais estar a adiar por algum tempo esse problema. Nessa parte já não te posso ajudar porque nunca trabalhei com isso.

Cumps!

Share this post


Link to post
Share on other sites
diokhan

amanha quando chegar a empresa já altero o script.

quanto ao shutdown.sh, sim esta a funcionar bem, pois quando a executo na linha de comandos funciona normalmente, e pede a password do user tomcat, da primeira vez que corri, o meu código antigo que coloquei aqui, sem o try no shutdown o script fez o shutdown, apenas nao fez o kill nem o startup.

o shutdown.sh e o startup.sh já são ficheiros que existiam, penso que já são próprios do tomcat, eu uso esses comandos porque foram os que o meu chefe deu-me, e ele disse que sempre usou esses comandos.

mas vou alterar o código e ver o que acontece, e assim que tiver novidades aviso.

e obrigado pela ajuda :thumbsup:


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
NuGuN

Ah estas a utilizar os que vêm com o tomcat. Ok.

Ele não executa o kill e o startup porque quando procura pela string 'Password:' o script dá erro e pára.

Agora tens de ver é porque não pede a password.

Cumps!

Share this post


Link to post
Share on other sites
diokhan

eu neste momento tenho algo deste genero:

p = pexpect.spawn("su tomcat /home/Software/apache-tomcat-6.0.20/bin/shutdown.sh")
        p.logfile = sys.stdout
        #p.expect('Password:')
        #p.sendline(str(password))

p = pexpect.spawn("su tomcat /home/Software/apache-tomcat-6.0.20/bin/startup.sh")
        #p.logfile = sys.stdout
        p.expect('Password:')
        p.sendline(str(password))

para ver o que acontece, penso que esta linha, p.logfile = sys.stdout, ou esta no lugar errado ou não esta a fazer nada. eu assim que resolver o problema ou tiver mais novidades aviso

:)


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
SirDave

Boas,

eu preciso de fazer uma alteração num script que tenho em python, basicamente o script serve para verificar se os meus sites estão online ou offline, ate aqui esta a funcionar.

o que gostaria de implementar era, caso os sites estejam offline, queria fazer um shutdow ao tomcat (com "su tomcat"), um kill ao tomcat (pelo "sudo kill -9 PID"), e depois um start ao tomcat (pelo "su tomcat").

mas todos tem passwords, há alguma forma de o fazer sem usar as passwords ou algum metodo de usar a password mas sem ser possível os utilizadores verem a password? 🤔

Para correres scripts em Bash (Linux) ou em Batch (Windows) dentro de um program Python faz:

import os

#Codigo
os.system("killall firefox") #Destroi todos os processos do firefox abertos no Linux

Um pequeno exemplo :)


Be nice to see your eyes, blink them from time to time to relax your retina when using the computer. Blink now!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.