convertendo BASH para Python (v2.6) [fechado]

3

Eu tenho este código no bash e não sei como traduzir as linhas com 'ps -C .....' e 'ps -eo ....' alguma ajuda sobre como escrever essas linhas?

if [ "$SwapUsedActivity" == "true" ]
then 
    echo "WARNING: Potential Swapping happening please check for increasing swap usage"
    echo "INFO: checking kswapd number of process and cputime, check for TIME colume for how busy kswapd was"
    ps -C kswapd0 -C kswapd1 -C kswapd2 -C kswapd3 -C kswapd4  -o pid,ppid,stime,etime,time,pcpu,args
else
    echo "INFO: High swap space usage detected, not a potential issue but check activity"
fi
else
    echo "INFO: Swap usage within the limits"
fi
if [ $AvgAnnonymousMemoryused -gt 20 ]
then 
    echo "INFO: High residential memory usage detected, this may not be an issue, please check top memory consuming processes"
    echo "INFO: Printing top 10 memory consuming processes"
    ps -eo pid,ppid,user,rss,comm --sort=rss | tail -10 
fi
    
por ShuKaibutsu 14.07.2015 / 16:39

2 respostas

5

Você pode usar o módulo subprocess :

#!/usr/bin/env python2
import subprocess
command_1 = 'ps -eo pid,ppid,user,rss,comm --sort=rss'.split()
command_2 = 'tail -10'.split()
first = subprocess.Popen(command_1, stdout=subprocess.PIPE)
subprocess.call(command_2, stdin=first.stdout)
  • command_1 é o comando à esquerda do canal, dividido em espaços para criar uma lista que é exigida por subprocess.Popen class

  • command_2 é o comando à esquerda da divisão de tubulação de maneira semelhante a command_1

  • first é um objeto da classe subprocess.Popen , subprocess.Popen executa o command_1 e envia seu STDOUT para PIPE para que possamos usá-lo como uma entrada para command_2

  • subprocess.call executará o command_2 com seu STDIN vindo do STDOUT de first

Para o comando ps -C kswapd0 -C kswapd1 -C kswapd2 -C kswapd3 -C kswapd4 -o pid,ppid,stime,etime,time,pcpu,args , você pode fazer:

#!/usr/bin/env python2
import subprocess
command = 'ps -C kswapd0 -C kswapd1 -C kswapd2 -C kswapd3 -C kswapd4  -o pid,ppid,stime,etime,time,pcpu,args'.split()
subprocess.call(command)

Leia a documentação oficial sobre o subprocesso para obter mais ideias.

    
por heemayl 14.07.2015 / 17:04
3

Eu usaria algo como psutil para pegar os dados programaticamente.

Isso vai demorar um pouco para aprender, então a alternativa mais rápida e mais sucinta é executar os comandos por meio de um constructo de estilo subshell do Python.

import commands
exit_code, output = commands.getstatusoutput('ps -eo pid,ppid,user,rss,comm --sort=rss')
print '\n'.join(output.split('\n')[-10:])

Eu movi o tail para o Python puro, apenas por diversão.

    
por Oli 14.07.2015 / 16:54