diff --git a/goat_monitor/goat_monitor.py b/goat_monitor/goat_monitor.py index 44015e1..cc76504 100644 --- a/goat_monitor/goat_monitor.py +++ b/goat_monitor/goat_monitor.py @@ -69,20 +69,25 @@ def wrap(command: List[str], config: Path, retries: int, version: bool, dry_run: attempt = 0 while attempt <= retries: # run the command - result = subprocess.run( + with subprocess.Popen( " ".join(command), shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, - encoding="utf-8", - ) + ) as proc: + stdout = "" + while True: + c = proc.stdout.read(1) + if c == b"": + break + s = c.decode("utf-8") + stdout += s + print(s, end="", flush=True) + return_code = proc.wait() - # TODO: print lines real time as the subprocess runs - print(result.stdout, end="") - - if result.returncode: + if return_code: # failed - title = f"Command failed with exit code {result.returncode}" + title = f"Command failed with exit code {return_code}" if attempt < retries: title += f" - Retrying (attempt {attempt+1}/{retries})" else: @@ -92,7 +97,7 @@ def wrap(command: List[str], config: Path, retries: int, version: bool, dry_run: title = "Command succeeded" MAX_LINES = 20 - lines = result.stdout.splitlines() + lines = stdout.splitlines() if len(lines) > MAX_LINES: lines = lines[-MAX_LINES:] message = ( @@ -106,13 +111,13 @@ def wrap(command: List[str], config: Path, retries: int, version: bool, dry_run: with gotify.Gotify(base_url=url, app_token=app_token) as gotify_connection: gotify_connection.create_message(message=message, title=title) - if not result.returncode: + if not return_code: # only retry on failure break attempt += 1 - sys.exit(result.returncode) + sys.exit(return_code) # %% main