I definitely have a deadlock problem with Shepherd and I do believe I've found it. shepherd 1.0.3
This is in service-controller when the service has been stopped: (when logger (put-message logger 'terminate)) But in service-builtin-logger, this is called every time a line is read: (or pid (and service (eq? 'running (service-status service)) (match (service-running-value service) ((? process? process) (process-id process)) (value value)))) service-status -> service-control-message -> put-message to the service The fibers documentation says put-message is blocking. Surely this is a deadlock. The value of `pid' can be cached and we might avoid the deadlock. But this happens ONLY if a line of output is read while the service is 'running. If output only comes while the service is 'starting/'stopping, we will keep calling service-status. Potential fix: At the time spawn-service-builtin-logger is called in fork+exec-command, we already know the pid. Maybe just prepend the pid to the `command' argument if you want it to appear in the log output.