вывод подпроцесса python усечен

При запуске команды оболочки в python с использованием подпроцесса я получаю неправильный вывод.

grep (com.vertica.solutions.kafka.Launcher) в оболочке bash

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

grep (com.vertica.solutions.kafka.Launcher) в оболочке Python

>>> 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. Как и когда я grep со словом kafka, я получаю результат, но это нежелательно.

только grep kafka

>>> 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'

When I grep only with word kafka I get the process (pid 413872) but in python shell COMMAND column output of process command is incomplete.


person Sagar Shinde    schedule 09.12.2017    source источник
comment
Это ничего не усекает,   -  person user1767754    schedule 11.12.2017
comment
cmd = ps auxww | grep com.vertica.solutions.kafka.Launcher | grep -v grep | awk '{print $2}' Используя флаг ww, я получил правильный результат.   -  person Sagar Shinde    schedule 22.12.2017


Ответы (1)


Подпроцесс не является truncating тем, что записано в stdout, он передается в ваш сеанс Python. Что происходит, так это то, что -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 

Это гарантирует, что в случае неудачи grep вместо того, чтобы возвращать код ошибки, он просто сбрасывает его.

person user1767754    schedule 10.12.2017