The code you have shown has a problem. You are assigning an array (1..100) as the value in a hash. You need an array reference
Yeah, yeah. That's obviously not working code and I was trimming down my real program to just show the basic structure.
Also, I tried your CORE::GLOBAL::exit override, and it didn't do anything--it only got worked if I explicitly called the exit() command, which your code does not.
I said in my OP I never directly call exit. But my unstated assumption is that one of the many CPAN modules I am using might be calling it.
I think your problem must be in the processing that you are not showing. It could be failing on the same one each time. Because you are processing in a random order, it would take varying amounts of time for that condition to be reached.
I'm intentionally not wrapping anything in eval, so if something in my code does fail, it should bomb out loudly. It never does.
I suggest some good, old-fashioned debug print statements within your processing loop. Log the id of each record you are looking at, and record the success of each significant operation. That should help you to know where it fails.
The print statement I have in the example already prints before the processing starts, so I see which record it stops at. It's never the same one. Plus, as I mentioned above, any error in my code would die loudly. But I'm not sure why the program can terminate with exit value of 0, yet the END block is never called.
So my assumption is that one of the CPAN modules is at fault, but whatever is the cause, I was hoping there was some module that would perform the necessary overrides and tell me what's calling exit.