So I'm trying to query for the top 3 CPU "intensive" processes on a given machine, and I found this shell command to do it: ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3
I want to use this data inside a Python script, so I need to be able to capture the output of the above command via the subprocess
module. The following works, but just returns a huge string since I'm not restricting it to the top 3:
psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])
I'm not quite sure how this subprocess.check_output
works.. in a meager attempt I tried:
subprocess.check_output(['ps', '-eo', 'pcpu,user,args', '|', 'sort', '-k', '1', '-r', '|', 'head', '-3'])
Which gives me an error: ps: illegal argument: |
How do I use the pipe |
symbol inside Python, or use some other way to do the sorting without having to do incredible amounts of parsing on the huge string returned by psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])
?
Thanks! Regards, -kstruct
To use a pipe with the subprocess module, you have to pass shell=True . In your particular case, however, the simple solution is to call subprocess. check_output(('ps', '-A')) and then str. find on the output.
Python Subprocess Run Function run() function was added in Python 3.5 and it is recommended to use the run() function to execute the shell commands in the python program. The args argument in the subprocess. run() function takes the shell command and returns an object of CompletedProcess in Python.
PIPE as either of them you specify that you want the resultant Popen object to have control of child proccess's stdin and/or stdout , through the Popen 's stdin and stdout attributes.
After reading the docs, I came to know that shell=True means executing the code through the shell. So that means in absence, the process is directly started.
You can pass the shell=True
argument to execute the plain shell command:
import subprocess
subprocess.check_output('ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3',
shell=True)
Alternatively, use the sorting options of ps and Python's built-in string functions like this:
raw = subprocess.check_output('ps -eo pcpu,pid,user,args --sort -pcpu')
first_three_lines = list(raw.split('\n'))[:3]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With