I've hit this one to, and after some testing figured out whats happening and what a solution.
My conclusion is that during boot, the system is usually loaded enough that the forked process about start whats declared in ExecStart= haven't gotten around to setuid down to the puppet user yet, so it's still running as root. When the ExecStartPost= command starts it gets to the kill -0 $MAINPID before $MAINPID have switched user and thus, kill gets EPERM. I just added a sleep 1 before the while in ExecStartPost= fixes things: diff --git i/debian/puppetserver.service w/debian/puppetserver.service index c0e5a2a..d52d8d0 100644 --- i/debian/puppetserver.service +++ w/debian/puppetserver.service @@ -29,7 +29,7 @@ ExecStart=/usr/bin/java $JAVA_ARGS \ --bootstrap-config /etc/puppet/puppetserver/services.d \ --restart-file ${RUNTIME_DIRECTORY}/restart \ $TK_ARGS -ExecStartPost=sh -c "while ! head -c1 ${RUNTIME_DIRECTORY}/restart | grep -q '^1'; do kill -0 $MAINPID && sleep 1 || exit 1; done" +ExecStartPost=sh -c "sleep 1 ; while ! head -c1 ${RUNTIME_DIRECTORY}/restart | grep -q '^1'; do kill -0 $MAINPID && sleep 1 || exit 1; done" ExecReload=sh -c "echo -n 0 > ${RUNTIME_DIRECTORY}/restart" ExecReload=kill -HUP $MAINPID //Anton