Configure Health Checks#
Health checks control how the broker decides whether a process is healthy. They are observed by the broker monitor after a process starts and then at the configured interval.

Lifecycle#
A newly started service reports health="unknown" until a check passes or
the startup period expires. A passing check changes it to healthy. A
failing check during start_period_s keeps the service in starting; a
failing check after that period changes it to unhealthy.
cb start is not a readiness gate. It returns after the process is started
and the first health check may run shortly afterwards. Use cb wait SERVICE
when a script needs a ready service, and cb status SERVICE to inspect the
current health state.
When a check fails:
restart_policy="never"leaves the process state visible as unhealthy and does not restart it.restart_policy="on-failure"or"always"emitsservice.unhealthy, stops the process with the configured graceful stop behavior, and schedules a restart with exponential backoff.The scheduled restart emits
service.restart_scheduledwithdata.reason == "health".
Process Health#
HealthCheck(type="process")
The process is healthy while the child process is still alive.
TCP Health#
HealthCheck(type="tcp", host="127.0.0.1", port=8765, interval_s=5, timeout_s=1)
Use TCP checks for services with a local socket but no HTTP endpoint.
If the service declares an endpoint, bind the check to that endpoint:
HealthCheck(type="tcp", endpoint="default", interval_s=5, timeout_s=1)
HTTP Health#
HealthCheck(type="http", url="http://127.0.0.1:8765/health")
HTTP status codes from 200 through 399 are healthy. Client and server error responses are unhealthy.
Endpoint-bound HTTP checks use the resolved endpoint URL:
HealthCheck(type="http", endpoint="default", interval_s=5, timeout_s=1)
Exec Health#
import sys
HealthCheck(
type="exec",
command=(sys.executable, "-m", "my_provider.healthcheck"),
)
Use exec checks for custom local validation. Keep them fast, deterministic, and side-effect-light.
Exec health checks inherit the service’s merged environment, working directory, and broker-injected endpoint variables. They still run as separate child commands. Prefer absolute commands or provider-controlled module commands, and keep timeouts short. Health check I/O runs outside the supervisor state lock, so status queries remain responsive while a check is in progress.
Startup Period#
The default start_period_s is five seconds. During that period, failing
checks do not restart the service. This matters for services that need a
moment to bind a dynamically assigned endpoint port.
HealthCheck(type="http", endpoint="default", start_period_s=10)
Set start_period_s=0 when the first failed check should immediately count
as an unhealthy service.