Quiero usar subprocess.check_output()
con ps -A | grep 'process_name'
ps -A | grep 'process_name'
. Probé varias soluciones pero hasta ahora nada funcionó. ¿Alguien me puede guiar cómo hacerlo?
Para usar una tubería con el módulo de subprocess
, debe pasar shell=True
.
Sin embargo, esto no es realmente recomendable por varias razones, entre las que se encuentra la seguridad. En su lugar, cree los procesos ps
y grep
separado, y canalice la salida de uno a otro, así:
ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE) output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout) ps.wait()
Sin embargo, en su caso particular, la solución simple es llamar a subprocess.check_output(('ps', '-A'))
y luego str.find
en la salida.
O siempre puede utilizar el método de comunicación en los objetos de subproceso.
cmd = "ps -A|grep 'process_name'" ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT) output = ps.communicate()[0] print output
El método de comunicación devuelve una tupla de la salida estándar y el error estándar.
Consulte la documentación sobre la configuración de una canalización utilizando subproceso: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
No he probado el siguiente ejemplo de código, pero debería ser aproximadamente lo que quieres:
query = "process_name" ps_process = Popen(["ps", "-A"], stdout=PIPE) grep_process = Popen(["grep", query], stdin=ps_process.stdout, stdout=PIPE) ps_process.stdout.close() # Allow ps_process to receive a SIGPIPE if grep_process exits. output = grep_process.communicate()[0]
Además, intente usar 'pgrep'
comando 'pgrep'
lugar de 'ps -A | grep 'process_name'
'ps -A | grep 'process_name'
La solución de JKALAVIS es buena, sin embargo, agregaría una mejora para usar shlex en lugar de SHELL = TRUE. debajo im grepping fuera tiempos de consulta
#!/bin/python import subprocess import shlex cmd = "dig @8.8.4.4 +notcp www.google.com|grep 'Query'" ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT) output = ps.communicate()[0] print output
Aclamaciones,
Puedes probar la funcionalidad de la tubería en sh.py :
import sh print sh.grep(sh.ps("-ax"), "process_name")