Python 如何使用asyncio管理复杂的shell进程?

Python 如何使用asyncio管理复杂的shell进程?,python,concurrency,python-asyncio,Python,Concurrency,Python Asyncio,我想用python的asyncio模块跟踪守护进程的重新启动过程。所以我需要运行shell命令tail-f-n0/var/log/daemon.log并分析它的输出,比如说,服务守护进程在后台重新启动。在服务重启命令完成执行并报告其内部检查后,守护进程继续写入日志。Track process read检查信息并根据其内部逻辑报告重新启动是否成功 import asyncio from asyncio.subprocess import PIPE, STDOUT async def track(

我想用python的asyncio模块跟踪守护进程的重新启动过程。所以我需要运行shell命令
tail-f-n0/var/log/daemon.log
并分析它的输出,比如说,
服务守护进程在后台重新启动。在服务重启命令完成执行并报告其内部检查后,守护进程继续写入日志。Track process read检查信息并根据其内部逻辑报告重新启动是否成功

import asyncio
from asyncio.subprocess import PIPE, STDOUT

async def track():
    output = []
    process = await asyncio.create_subprocess_shell(
        'tail -f -n0 ~/daemon.log',
        stdin=PIPE, stdout=PIPE, stderr=STDOUT
    )
    while True:
        line = await process.stdout.readline()
        if line.decode() == 'reboot starts\n':
            output.append(line)
            break
    while True:
        line = await process.stdout.readline()
        if line.decode() == '1st check completed\n':
            output.append(line)
            break
    return output

async def reboot():
    lines = [
        '...',
        '...',
        'reboot starts',
        '...',
        '1st check completed',
        '...',
    ]
    p = await asyncio.create_subprocess_shell(
        (
            'echo "rebooting"; '
            'for line in {}; '
                'do echo $line >> ~/daemon.log; sleep 1; '
            'done; '
            'echo "rebooted";'
        ).format(' '.join('"{}"'.format(l) for l in lines)),
        stdin=PIPE, stdout=PIPE, stderr=STDOUT
    )
    return (await p.communicate())[0].splitlines()

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.gather(
        asyncio.ensure_future(track()),
        asyncio.ensure_future(reboot())
    ))
    loop.close()
这段代码是我发现的并行运行两个协程的唯一方法。但是,如何在
重新启动之前严格运行
track()
,以避免丢失日志中任何可能的输出?以及如何检索这两个协程的返回值

但如何在重新启动前严格运行track(),以避免丢失日志中任何可能的输出

您可以在运行第二个子流程之前等待第一个子流程的创建

以及如何检索这两个协程的返回值

返回聚合结果

例如:

async def main():
    process_a = await asyncio.create_subprocess_shell([...])
    process_b = await asyncio.create_subprocess_shell([...])
    return await asyncio.gather(monitor_a(process_a), monitor_b(process_b))

loop = asyncio.get_event_loop()
result_a, result_b = loop.run_until_complete(main())

正是我的意思!