2017-12-09 7 views
0

파이썬에서 서브 프로세스를 사용하여 쉘 명령을 실행하는 중에 출력이 잘못되었습니다.파이썬 서브 프로세스 출력이 잘림

그렙 배시 셸 (com.vertica.solutions.kafka.Launcher)

ps -ef | grep com.vertica.solutions.kafka.Launcher 
root  92300 39024 0 23:06 pts/1 00:00:00 grep --color=auto com.vertica.solutions.kafka.Launcher 
dbadmin 413872 413868 0 22:06 pts/0 00:00:24 java -cp /opt/vertica/packages/kafka/bin/../lib/*:/opt/vertica/java/lib/vertica-jdbc.jar:/opt/vertica/packages/kafka/bin/../config/* -Dlog4j.configurationFile=/opt/vertica/packages/kafka/bin/../config/vkafka-log-config.xml -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector com.vertica.solutions.kafka.Launcher --conf /home/dbadmin/live.conf 

그렙 파이썬 쉘 (com.vertica.solutions.kafka.Launcher)

>>> cmd = "ps aux |grep com.vertica.solutions.kafka.Launcher| grep -v grep" 
>>> check_output(cmd,shell=True).strip() 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/usr/lib64/python2.7/subprocess.py", line 575, in check_output 
raise CalledProcessError(retcode, cmd, output=output) 
subprocess.CalledProcessError: Command 'ps aux |grep com.vertica.solutions.kafka.Launcher| grep -v grep' returned non-zero exit status 1 

이것은 하위 프로세스가 ps 출력을 절단하기 때문입니다. 내가 kafka라는 단어로 grep 할 때 나는 결과를 얻었지만 그럴 필요는 없다.

그렙 만 카프카

>>> cmd = "ps aux | grep kafka | grep -v grep" 
>>> check_output(cmd,shell=True).strip() 
dbadmin 413868 0.0 0.0 113128 1372 pts/0 S 22:06 0:00 /bin/bash /opt/vertica/packages/kafka/bin/vkconfig launch --conf /home/dbadmin/live.conf\n 
dbadmin 413872 0.6 1.0 7403000 175544 pts/0 Sl 22:06 0:25 java -cp /opt/vertica/packages/kafka/bin/../lib/*:/opt/vertica/java/lib/vertica-jdbc.jar:/opt/vertica/package' 

난 단지 단어 카프카와 grep을 나는 과정을 얻을 PID (413872)하지만 파이썬 쉘 proce의 COMMAND 컬럼 출력 ss 명령이 불완전합니다.

+0

그것은 아무것도 절단 아니에요, – user1767754

+0

에 cmd = "추신 auxww | 그렙 com.vertica.solutions.kafka.Launcher | 그렙 -v 그렙 | AWK '{$ 2 인쇄}' '내가 올바른 결과를 얻었다 전주 플래그를 사용하여 합니다. –

답변

0

서브 프로세스가 truncating이 아니어도 stdout에 쓰여진 내용은 파이썬 세션으로 전달됩니다. -v이 성공적이지 않으므로 잘못된 리턴 코드 (None Zero)로 종료됩니다.

당신이 다음과 같은 작업을 수행 할 수 그렙에서 출력을하지 않는 경우를 무시하려면 대신 오류를 반환하는 grep을 성공하지 못한 경우에 있는지 확인합니다
import os 
from subprocess import Popen 

DEVNULL = open(os.devnull, 'wb') 
cmd = 'ps aux |grep com.vertica.solutions.kafka.Launcher| grep -v grep' 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=DEVNULL, shell=True) 
print process.communicate()[0] #output 

코드, 그냥 그것을 덤프합니다.