我通过python的子进程(特别是在AWS EC2上)在linux机器上启动一个进程,它生成了许多文件。我需要“tail -f”这些文件并将每个生成的jsonified输出发送到它们各自的AWS SQS队列。我将如何完成这项任务?
修改
根据此回答asyncproc和PEP3145的建议,我可以执行以下操作:
from asyncproc import Process
import Queue
import os
import time
# Substitute AWS SQS for Queue
sta_queue = Queue.Queue()
msg_queue = Queue.Queue()
running_procs = {'status':(Process(['/usr/bin/tail', '--retry', '-f','test.sta']),sta_queue),'message':(Process(['/usr/bin/tail', '--retry', '-f', 'test.msg' ]),msg_queue)}
def handle_proc(p,q):
latest = p.read()
if latest:
# If nothing new, latest will be an empty string
q.put(latest)
retcode = p.wait(flags=os.WNOHANG)
return retcode
while len(running_procs):
proc_names = running_procs.keys()
for proc_name in proc_names:
proc, q = running_procs[proc_name]
retcode = handle_proc(proc, q)
if retcode is not None: # Process finished.
del running_procs[proc_name]
time.sleep(1.0)
print("Status queue")
while not sta_queue.empty():
print(sta_queue.get())
print("Message queue")
while not msg_queue.empty():
print(msg_queue.get())
我认为这应该足够了,除非其他人可以提供更好的答案。
更多编辑
我正在思考这个问题。虽然上面的工作很好,但我认为最简单的解决方案是: - 检查文件是否存在 - 如果文件存在,请将它们复制到AWS S3上的存储桶,并通过AWS SQS发送已复制文件的消息。每60秒重复一次 -consumer app轮询SQS并最终收到文件已被复制的消息 -consumer app从S3下载文件,并用最新内容替换以前的内容。重复直到作业完成
虽然子进程中异步IO的整个问题仍然存在问题。
答案 0 :(得分:0)
您可以使用subprocess.Popen类来运行 tail 并阅读其输出。
try:
process = subprocess.Popen(['tail', '-f', filename], stdout=PIPE)
except (OSError, ValueError):
pass # TODO: handle errors
output = process.stdout.read()
subprocess.check_output功能在单行中提供此功能。它是Python 2.7版本中的新功能。
try:
output = subprocess.check_output(['tail', '-f', filename], stdout=PIPE)
except CalledProcessError:
pass # TODO: handle errors
对于非阻塞I / O,请参阅this question。