Catch worker exceptions and exit with a custom status.
Use Process.waitpid2 to avoid global variables.
Separate an unconditional #cleanup_pid from #cleanup_worker.

Worker should never be nil here, either: if it is, an explosion is what we want.
Use a non-blocking select to pick a worker.

This lets us do other things if no worker is available, like check if the workers are still running.
Detect failed workers and exit gracefully.

To detect failed workers, we do a non-blocking check for exited workers. A failed worker is one whose exit status is EXIT_FAILED.
Don't print a summary if all of the workers failed.