Compare commits

...

3 Commits
v3.1.1 ... main

Author SHA1 Message Date
22000ec4c0 don't wait for stdin to close 2023-05-29 17:48:30 +02:00
6bb276b509 strip output only right 2023-05-29 17:47:10 +02:00
1045dddb46 memoize stdin/stdout/stderr fds 2023-05-29 17:42:12 +02:00

View File

@ -465,9 +465,12 @@ def main():
stdout_logger = proc_logger.getChild("stdout") stdout_logger = proc_logger.getChild("stdout")
stderr_logger = proc_logger.getChild("stderr") stderr_logger = proc_logger.getChild("stderr")
os.set_blocking(proc.stdin.fileno(), False) stdin_fd = proc.stdin.fileno()
os.set_blocking(proc.stdout.fileno(), False) stdout_fd = proc.stdout.fileno()
os.set_blocking(proc.stderr.fileno(), False) stderr_fd = proc.stderr.fileno()
os.set_blocking(stdin_fd, False)
os.set_blocking(stdout_fd, False)
os.set_blocking(stderr_fd, False)
poll = select.poll() poll = select.poll()
poll.register( poll.register(
@ -481,7 +484,7 @@ def main():
proc.stderr, proc.stderr,
select.POLLIN | select.POLLPRI | select.POLLHUP | select.POLLERR, select.POLLIN | select.POLLPRI | select.POLLHUP | select.POLLERR,
) )
pollc = 3 pollc = 2
# logger.debug("First poll...") # logger.debug("First poll...")
events = poll.poll() events = poll.poll()
# logger.debug("Done, %d event(s)", len(events)) # logger.debug("Done, %d event(s)", len(events))
@ -493,7 +496,7 @@ def main():
for rfd, event in events: for rfd, event in events:
# logger.debug("rfd=%d, event=%x", rfd, event) # logger.debug("rfd=%d, event=%x", rfd, event)
if event & select.POLLOUT: if event & select.POLLOUT:
if rfd == proc.stdin.fileno(): if rfd == stdin_fd:
if chunk := pipe_buffer[:PIPE_BUF]: if chunk := pipe_buffer[:PIPE_BUF]:
# logger.debug( # logger.debug(
# "Writing chunk of length %d...", len(chunk) # "Writing chunk of length %d...", len(chunk)
@ -510,7 +513,7 @@ def main():
else: else:
proc.stdin.close() proc.stdin.close()
if event & select.POLLIN or event & select.POLLPRI: if event & select.POLLIN or event & select.POLLPRI:
if rfd == proc.stdout.fileno(): if rfd == stdout_fd:
# logger.debug("Reading from stdout...") # logger.debug("Reading from stdout...")
if chunk := proc.stdout.buffer.read(PIPE_BUF): if chunk := proc.stdout.buffer.read(PIPE_BUF):
# logger.debug("Done, length %d", len(chunk)) # logger.debug("Done, length %d", len(chunk))
@ -527,12 +530,12 @@ def main():
# logger.debug("Split: %r, %r, %r", line, sep, rest) # logger.debug("Split: %r, %r, %r", line, sep, rest)
if sep: if sep:
stdout_logger.info( stdout_logger.info(
line.decode(errors="replace").strip() line.decode(errors="replace").rstrip()
) )
stdout_line_buffer = rest stdout_line_buffer = rest
else: else:
break break
if rfd == proc.stderr.fileno(): if rfd == stderr_fd:
# logger.debug("Reading from stderr...") # logger.debug("Reading from stderr...")
if chunk := proc.stderr.buffer.read(PIPE_BUF): if chunk := proc.stderr.buffer.read(PIPE_BUF):
# logger.debug("Done, length %d", len(chunk)) # logger.debug("Done, length %d", len(chunk))
@ -549,27 +552,28 @@ def main():
# logger.debug("Split: %r, %r, %r", line, sep, rest) # logger.debug("Split: %r, %r, %r", line, sep, rest)
if sep: if sep:
stderr_logger.info( stderr_logger.info(
line.decode(errors="replace").strip() line.decode(errors="replace").rstrip()
) )
stderr_line_buffer = rest stderr_line_buffer = rest
else: else:
break break
if event & select.POLLERR: if event & select.POLLERR:
if rfd == proc.stdin.fileno(): if rfd == stdin_fd:
logger.error("STDIN error") logger.error("STDIN error")
if rfd == proc.stdout.fileno(): if rfd == stdout_fd:
logger.error("STDOUT error") logger.error("STDOUT error")
if rfd == proc.stderr.fileno(): if rfd == stderr_fd:
logger.error("STDERR error") logger.error("STDERR error")
if event & select.POLLHUP: if event & select.POLLHUP:
if rfd == proc.stdin.fileno(): if rfd == stdin_fd:
logger.debug("STDIN closed") logger.debug("STDIN closed")
if rfd == proc.stdout.fileno(): if rfd == stdout_fd:
logger.debug("STDOUT closed") logger.debug("STDOUT closed")
if rfd == proc.stderr.fileno(): pollc -= 1
if rfd == stderr_fd:
logger.debug("STDERR closed") logger.debug("STDERR closed")
pollc -= 1
poll.unregister(rfd) poll.unregister(rfd)
pollc -= 1
if pollc > 0: if pollc > 0:
# logger.debug("Poll...") # logger.debug("Poll...")