Если для службы - например так, типовой путь:
log.info("ramLog: запуск");
function makeNewVirtualControl(vdName, nameControl, typeControl) {
// Пробуем создать; если оно уже есть — defineVirtualDevice
// "Device with given ID already exists", ловим и пропускаем создание.
try {
log.info("Создаём виртуальное устройство {}", vdName);
defineVirtualDevice(vdName, {
title: vdName,
cells: {}
});
} catch (e) {
log.info("Устройство {} уже существует, пропускаем создание ({})", vdName, e.message);
}
var vdev = getDevice(vdName);
if (!vdev) {
log.error("Не удалось получить устройство {}", vdName);
return;
}
// Проверим, есть ли контрол; если нет, создадим его.
if (!vdev.isControlExists(nameControl)) {
log.debug("Контрола {} нет, создаем.", nameControl);
vdev.addControl(nameControl, typeControl);
}
}
var RAM_VDEV_NAME = "ramLog";
var RAM_CONTROL_NAME = "occupedMosquittoRAM";
makeNewVirtualControl(RAM_VDEV_NAME, RAM_CONTROL_NAME, {
type: "value",
value: 0,
units: "kB",
readonly: true,
forceDefault: false
});
function updateWbMosquittoRamUsage() {
// Суммируем RSS (kB) для всех процессов.
runShellCommand("ps -C mosquitto -o rss= | awk '{sum+=$1} END {print (sum ? sum : 0)}'", {
captureOutput: true,
exitCallback: function (exitCode, capturedOutput) {
if (exitCode !== 0) {
log.warning("ramLog: команда завершилась с кодом {}", exitCode);
return;
}
var value = parseInt(String(capturedOutput).trim(), 10);
if (isNaN(value)) {
log.warning("ramLog: не удалось разобрать значение RAM из '{}'", capturedOutput);
return;
}
dev[RAM_VDEV_NAME + "/" + RAM_CONTROL_NAME] = value;
log.debug("ramLog: RSS = {} kB", value);
}
});
}
// Первичное обновление при старте скрипта.
updateWbMosquittoRamUsage();
// Обновление каждую минуту.
setInterval(function () {
updateWbMosquittoRamUsage();
}, 60 * 1000);
