{% extends "admin/jobs/base.html" %} {% from "admin/jobs/macros.html" import timestamp, paging with context %} {% block jobs_filters %}
{% if filters.q or filters.state %}Clear{% endif %}
{% endblock %} {% block jobs_content %}
All workers
{{ total }}
Registered processes
Online
{{ online_count }}
Including idle workers
Offline
{{ offline_count }}
Stopped or missing heartbeat

Workers

Offline after {{ '%g' | format(offline_seconds) }}s without a heartbeat
{% for item in workers %}{% set worker = item.worker %} {% else %}{% endfor %}
Worker / PIDStatusQueuesActive / SlotsSucceededFailedLast heartbeatStarted / Stopped
{{ worker.hostname }}PID {{ worker.pid }}{% if perms.jobs.view_task %} ยท View tasks{% endif %}{{ 'Online' if item.online else 'Offline' }}{% for queue in worker.queues %}{{ queue }}{% endfor %}{{ item.active }} / {{ worker.concurrency }}{{ item.stats.get('SUCCESS', 0) }}{{ item.stats.get('FAILURE', 0) }}{{ timestamp(worker.heartbeat_at) }}{{ timestamp(worker.started_at) }}{% if worker.stopped_at %}Stopped {{ worker.stopped_at | format_datetime('%H:%M:%S') }}{% endif %}

No workers match these filters

Workers appear here when they start, even before receiving a task.

{{ paging(page, pages, filtered, request) }}

Task counts reflect retained jobs. An offline worker may still have an expired task awaiting recovery.

{% endblock %}