I'd have to agree with the "why CGI" question, but that aside, I've done this with PID files. The file serves as a lock; if another instance tries to run the contents are looked at to see if the PID is actually running.
The caveat here is that I did not use Proc::PID::File as most people do. I wrote mine years ago before that existed or before I knew it existed so I don't know if it handles that as mine does. I open the file like this to (I think) allow only one process at a time to get at it. I should review this now that I know more. 8-)
local *PID_FH;
sysopen(PID_FH, $file, O_RDWR | O_CREAT) or die
"Can't open PID file $file: $!\n";
flock(PID_FH, LOCK_EX) or die
"Can't get write lock on PID file $file: $!\n";