如何使用python中的子进程获得“ps aux”命令的全部结果?

2024-05-21 02:30:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究python脚本。我的脚本想要做同样的事情,比如ps aux | grep qemu,但是由于某些原因,我不得不使用python。我想得到这个字符串并在这个字符串中得到一些配置:

root 46358 0.7 0.1 3398200 137232 ? Sl Aug31 8:10 /usr/local/bin/qemu-system-x86_64_2.6.0 -enable-kvm -cpu qemu64,+vmx,+ssse3,+sse4.1,+sse4.2,+x2apic,+aes,+avx,+vme,+pat,+ss,+pclmulqdq,+xsave,level=13 -machine pc,accel=kvm -chardev socket,id=hmqmondev,port=55902,host=127.0.0.1,nodelay,server,nowait -mon chardev=hmqmondev,id=hmqmon,mode=readline -rtc base=utc,clock=host,driftfix=none -usb -device usb-tablet -daemonize -nodefaults -nodefconfig -no-kvm-pit-reinjection -global kvm-pit.lost_tick_policy=discard -vga std -k en-us -smp 8 -name gangyewei-3 -m 2048 -boot order=cdn -vnc :2,password -drive file=/opt/cloud/workspace/disks/d955706a-a091-4c80-8d0c-3b9267953ff2,if=none,id=drive_0,format=qcow2,cache=none,aio=native -device virtio-blk-pci,id=dev_drive_0,drive=drive_0,bus=pci.0,addr=0x5 -drive file=/opt/cloud/workspace/disks/c0b5bb2b-38e6-4c54-8953-fa90962abae9,if=none,id=drive_1,format=qcow2,cache=none,aio=native -device virtio-blk-pci,id=dev_drive_1,drive=drive_1,bus=pci.0,addr=0x6 -drive file=/opt/cloud/workspace/disks/d60c0a8b-14ce-4adf-92cb-e6a136228825,if=none,id=drive_2,format=qcow2,cache=none,aio=native -device virtio-blk-pci,id=dev_drive_2,drive=drive_2,bus=pci.0,addr=0x7 -device ide-cd,drive=ide0-cd0,bus=ide.1,unit=1 -drive id=ide0-cd0,media=cdrom,if=none -chardev socket,id=char-n-2a6106e0,path=/usr/local/var/run/openvswitch/n-2a6106e0,server -netdev type=vhost-user,id=n-2a6106e0,chardev=char-n-2a6106e0,vhostforce=on -device virtio-net-pci,netdev=n-2a6106e0,mac=00:22:2a:61:06:e0,id=netdev-n-2a6106e0,addr=0xf -object memory-backend-file,id=mem,size=2048M,mem-path=/mnt/huge,share=on -numa node,memdev=mem -mem-prealloc -pidfile /opt/cloud/workspace/servers/1925a92d-f003-4d77-871c-bce8f85229aa/pid -chardev socket,path=/opt/cloud/workspace/servers/1925a92d-f003-4d77-871c-bce8f85229aa/qga.sock,server,nowait,id=qga0 -device virtio-serial -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0

我的python代码如下:

def process_system_cmd(command):
    response = {}
    # use subprocess to process cmd
    child = subprocess.Popen(command, stdout=subprocess.PIPE,
            stderr=subprocess.PIPE)
    ret, err = child.communicate()

    if err:
        response["err"] = -1
        response["ret"] = err.partition(":")[2]
    else:
        response["err"] = 0
        response["ret"] = ret

    return response

# vm_socks = {"qga_socks": ["qga1.sock", ...],
#   "monitor_socks":["127.0.0.1:55632", ...]}
def process_vm_socks():
    response = process_system_cmd("ps aux".split())

    if (response["err"]):
        return

    vm_socks = {"qga_socks":[], "monitor_socks":[]}
    res_list = response["ret"].splitlines()
    for res in res_list:
        patt = '.*/usr/local/bin/qemu-system-x86_64.*'
        if (res == None or res == '' or
            re.match(patt, res) == None):
            continue
        # parse qga socket
        socks = re.split(r'.*socket,path=(.*),server,nowait,id=.*', res)
        if (len(socks) == 3 and is_qga_socket(socks[1])):
            vm_socks["qga_socks"].append(socks[1])

但是当我调试的时候,我在下面的代码中发现'parse qga socket',res'中的值是:

root 46358 0.7 0.1 3398200 137232 ? Sl Aug31 8:10 /usr/local/bin/qemu-system-x86_64_2.6.0 -enable-kv

这不是我所期望的全部。对于shell,我使用ps aux | grep qemu,我将得到如上所述的我期望的整个字符串。我猜python在行尾添加了'\n',但是我不知道为什么以及如何修复这个bug?在

那我该怎么办?谢谢~


Tags: noneidifresponsedeviceresdrivesocket