#!/bin/zsh setopt no_unset extended_glob H=${COLLECTD_HOSTNAME:-$HOST} INTERVAL=${COLLECTD_INTERVAL:-10} putval(){ printf 'PUTVAL %s/%s/gauge-%s N:%s\n' "$@" || exit $? } a() { awk ' BEGIN{ FS=": " } function putval(name, val) { printf "PUTVAL %s/zsv-%s/gauge-%s N:%f\n", H, $3, name, val } /^(ok|timeout): (run|down|finish): /{ sub(/\(pid [0-9]*\) /,"",$4) sub(/s.*/,"",$4) sub(/.*\//,"",$3) putval("ok", $1 == "ok" ? 1 : 0) putval("uptime", $2 == "run" ? $4 : -$4) } ' "$@" || exit $? } while sleep $INTERVAL; do sv check /run/service/*(N) | a H=$H for d in /etc/vservers/*(/N); do vs=$d:t vserver $vs running up=$? putval $H exe-vserver ${vs}_running $up if (($up == 0)); then vserver $vs exec /bin/sh -c 'sv check /run/service/*' | a H=$vs.$H fi done done