#!/usr/bin/env bash set -euo pipefail DB_NAME="${DB_NAME:-domain}" DB_USER="${DB_USER:-postgres}" PSQL_BIN="${PSQL_BIN:-/www/server/pgsql/bin/psql}" echo "[1/3] cluster nodes" "${PSQL_BIN}" -U "${DB_USER}" -d "${DB_NAME}" -Atc " select node_code || '|' || role || '|' || status || '|' || coalesce(current_load, 0) || '|' || to_char(last_heartbeat_at, 'YYYY-MM-DD HH24:MI:SS') || '|' || coalesce(metadata_json->>'worker_online', '') || '|' || coalesce(metadata_json->>'detect_participating', '') from detect_worker_nodes order by node_code; " echo echo "[2/3] active job distribution" "${PSQL_BIN}" -U "${DB_USER}" -d "${DB_NAME}" -Atc " select coalesce(claimed_by, '') || '|' || status || '|' || count(*) from detect_job_items where job_id = ( select id from detect_jobs where status in ('pending','running') order by id desc limit 1 ) group by claimed_by, status order by claimed_by, status; " echo echo "[3/3] condensed summary" "${PSQL_BIN}" -U "${DB_USER}" -d "${DB_NAME}" -At <<'SQL' with latest_job as ( select id, job_code, status from detect_jobs where status in ('pending','running') order by id desc limit 1 ), node_stats as ( select node_code, role, status, coalesce(metadata_json->>'worker_online', '') as worker_online, coalesce(metadata_json->>'detect_participating', '') as detect_participating from detect_worker_nodes ), item_stats as ( select coalesce(claimed_by, '') as claimed_by, status, count(*) as cnt from detect_job_items where job_id = (select id from latest_job) group by claimed_by, status ) select json_build_object( 'job', ( select json_build_object( 'job_code', coalesce(job_code, ''), 'status', coalesce(status, '') ) from latest_job ), 'online_nodes', ( select coalesce(json_agg(json_build_object( 'node_code', node_code, 'role', role, 'status', status, 'worker_online', worker_online, 'detect_participating', detect_participating ) order by node_code), '[]'::json) from node_stats where status in ('online', 'busy') ), 'claimed_distribution', ( select coalesce(json_agg(json_build_object( 'claimed_by', claimed_by, 'status', status, 'count', cnt ) order by claimed_by, status), '[]'::json) from item_stats ) ); SQL