I've been using
Schedule::Cron for many years. It will run as a daemon, spawn your jobs like cron and it has some options that might help you with your specific requirements:
-
nofork => 1
Don't fork when starting the scheduler. Instead, the jobs are executed within current process.
-
skip => 1
Skip any pending jobs whose time has passed. This option is only useful in combination with nofork where a job might block the execution of the following jobs for quite some time. By default, any pending job is executed even if its scheduled execution time has already passed. With this option set to true all pending which would have been started in the meantime are skipped.
The module also has a built-in pidfile generating mechanism.