If `runinterval` is sufficiently small, then we could get overruns. The service launches puppet, and this first run takes longer than the `runinterval`. The service loops back around and launches a second instance, which overwrites the `puppetpid` variable. The second instance tries to run, but sees that another instance is already running (due to puppet's lock file). The second instance now exits, and now we've lost the `puppetpid` that referred to the first instance which is still running.

You will either need to block waiting for the puppet process to complete, or you need to keep a list of pids.