I don't see anything obvious (and this seems like it should be something obvious). However, you do have die inside your exit subroutine a couple times, which could conceivably be causing trouble, since you're already in END. (You can't stack ENDs up)
Comment on Re: END{} Subroutine not being called for Child process
Interesting note. I wasn't sure if those would work, but checking a file open is sort of a habit for me, so it's one of those things that I put in there more out of routine than anything else.