Handle stuck processes reported by monitoring threads Args: stuck_signals: List of stuck process signals from monitoring threads active_processes: List of currently active processes (modified in place) failed_processes: List to track failed process commands
(
stuck_signals: list[StuckProcessSignal],
active_processes: list[RunningProcess],
failed_processes: list[str],
monitor: ProcessStuckMonitor,
)
| 1338 | |
| 1339 | |
| 1340 | def _handle_stuck_processes( |
| 1341 | stuck_signals: list[StuckProcessSignal], |
| 1342 | active_processes: list[RunningProcess], |
| 1343 | failed_processes: list[str], |
| 1344 | monitor: ProcessStuckMonitor, |
| 1345 | ) -> None: |
| 1346 | """ |
| 1347 | Handle stuck processes reported by monitoring threads |
| 1348 | |
| 1349 | Args: |
| 1350 | stuck_signals: List of stuck process signals from monitoring threads |
| 1351 | active_processes: List of currently active processes (modified in place) |
| 1352 | failed_processes: List to track failed process commands |
| 1353 | monitor: The process stuck monitor instance |
| 1354 | """ |
| 1355 | for signal in stuck_signals: |
| 1356 | proc = signal.process |
| 1357 | if proc in active_processes: |
| 1358 | ts_print( |
| 1359 | f"\nProcess appears stuck (no output for {signal.timeout_duration}s): {proc.command}" |
| 1360 | ) |
| 1361 | ts_print("Killing stuck process and its children...") |
| 1362 | proc.kill() # This now kills the entire process tree |
| 1363 | |
| 1364 | # Track this as a failure |
| 1365 | failed_processes.append(subprocess.list2cmdline(proc.command)) |
| 1366 | |
| 1367 | active_processes.remove(proc) |
| 1368 | monitor.stop_monitoring(proc) |
| 1369 | ts_print(f"Killed stuck process: {proc.command}") |
| 1370 | |
| 1371 | |
| 1372 | def run_test_processes( |
no test coverage detected