import datetime import fcntl import os import subprocess class LineReader: def __init__(self, file): self.file = file self.buffer = b'' self.line = '' def read_line(self): chunk = os.read(self.file.fileno(), 1024) if not chunk: raise ValueError self.buffer += chunk lines = self.buffer.split(b'\n') if len(lines) > 1: self.line = lines[-2].decode('utf-8') self.buffer = lines[-1] def cleanup(): proc1.terminate() proc2.terminate() proc1.wait() proc2.wait() def render(): now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') print(' '.join([now, reader1.line, reader2.line])) def set_nonblock(fd): fl = fcntl.fcntl(fd, fcntl.F_GETFL) fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK) proc1 = subprocess.Popen(['./random.sh'], stdout=subprocess.PIPE) proc2 = subprocess.Popen(['./random.sh'], stdout=subprocess.PIPE) set_nonblock(proc1.stdout.fileno()) set_nonblock(proc2.stdout.fileno()) reader1 = LineReader(proc1.stdout) reader2 = LineReader(proc2.stdout) try: while True: for reader in [reader1, reader2]: try: reader.read_line() except BlockingIOError: pass render() finally: cleanup()