Примеры
Готовые конфигурации и скрипты для типовых задач.
Мониторинг процессов с авто-перезапуском
Непрерывный мониторинг нескольких процессов. При превышении порогов CPU/ОЗУ или зависании процесса — автоматически перезапускает службу.
CaMonitor.json:
{
"scriptfile": "./monitor_daemon.js",
"arg": {
"monitors": [
{
"name": "myapp.exe",
"service": "MyService",
"cpu_limit": 95,
"ram_limit_mb": 1000,
"window_sec": 10
},
{
"name": "worker.exe",
"service": "WorkerService",
"cpu_limit": 80,
"ram_limit_mb": 500,
"window_sec": 15
}
]
}
}
monitor_daemon.js:
var monitors = arg.monitors;
var TICKS_PER_SEC = 5; // ~5 тиков в секунду (200 мс на proc_cpu)
// Счётчики перегрузки для каждого монитора
var overload_ticks = monitors.map(function() { return 0; });
while (true) {
for (var i = 0; i < monitors.length; i++) {
var m = monitors[i];
var window_ticks = m.window_sec * TICKS_PER_SEC;
// Поиск процесса
var f = proc_find(m.name);
if (!f.found) {
console.log("[WARN]", m.name, "— не найден");
overload_ticks[i] = 0;
continue;
}
var pid = f.pid;
// Сбор метрик (proc_cpu блокирует на 200 мс — естественный тик)
var cpu = proc_cpu(pid);
var ram = proc_ram(pid);
var live = proc_alive(pid);
// Проверка на зависание
if (!live.responding) {
console.log("[ACTION] Процесс завис:", m.name, "PID:", pid);
var r = svc_restart(m.service);
console.log("Перезапуск:", r.ok ? "OK" : r.error);
overload_ticks[i] = 0;
continue;
}
// Проверка порогов
var overloaded = (cpu.cpu > m.cpu_limit) || (ram.ram_mb > m.ram_limit_mb);
if (overloaded) {
overload_ticks[i]++;
console.log("[WARN]", m.name,
"CPU:", cpu.cpu.toFixed(1) + "%",
"RAM:", ram.ram_mb.toFixed(1) + "MB",
"| Перегрузка:", overload_ticks[i] + "/" + window_ticks + " тиков"
);
if (overload_ticks[i] >= window_ticks) {
console.log("[ACTION] Перезапуск службы:", m.service);
var r2 = svc_restart(m.service);
console.log("Результат:", r2.ok ? "OK" : r2.error);
overload_ticks[i] = 0;
}
} else {
// Сброс счётчика при возврате к норме
if (overload_ticks[i] > 0) {
console.log("[OK]", m.name, "— нагрузка в норме");
}
overload_ticks[i] = 0;
}
}
}
JsN.exe CaMonitor.json
Уведомление в Discord
CaDiscord.json:
{
"scriptfile": "./discord_send.js",
"arg": {
"discord_url": "https://discord.com/api/webhooks/1234567890/TOKEN",
"message": "Служба MyApp перезапущена в 14:35"
}
}
discord_send.js:
let payload = JSON.stringify({
content: arg.message
});
let r = http_post(arg.discord_url, payload, [
"Content-Type: application/json",
"User-Agent: JsN/1.0"
]);
if (r.error) {
console.log("[ERROR] Ошибка сети:", r.error);
} else if (r.status === 204) {
console.log("[OK] Сообщение отправлено в Discord");
} else {
console.log("[ERROR] HTTP", r.status, ":", r.body);
}
JsN.exe CaDiscord.json
Уведомление в Slack
CaSlack.json:
{
"scriptfile": "./slack_send.js",
"arg": {
"slack_url": "https://hooks.slack.com/services/T.../B.../...",
"message": "Служба MyApp перезапущена"
}
}
slack_send.js:
let payload = JSON.stringify({
text: arg.message
});
let r = http_post(arg.slack_url, payload, [
"Content-Type: application/json"
]);
if (r.error) {
console.log("[ERROR]", r.error);
} else if (r.status === 200) {
console.log("[OK] Сообщение отправлено в Slack");
} else {
console.log("[ERROR] HTTP", r.status);
}
JsN.exe CaSlack.json
Уведомление в Telegram
CaTelegram.json:
{
"scriptfile": "./telegram_send.js",
"arg": {
"token": "1234567890:ABCDEFGhijklmnopqrstuvwxyz",
"chat": "-1001234567890",
"message": "Служба MyApp перезапущена"
}
}
telegram_send.js:
let url = "https://api.telegram.org/bot" + arg.token +
"/sendMessage?chat_id=" + arg.chat +
"&text=" + encodeURIComponent(arg.message);
let r = http_get(url);
if (r.error) {
console.log("[ERROR]", r.error);
} else {
let resp = JSON.parse(r.body);
if (resp.ok) {
console.log("[OK] Сообщение отправлено в Telegram");
} else {
console.log("[ERROR]", resp.description);
}
}
JsN.exe CaTelegram.json
Отправка Email
CaEmail.json:
{
"scriptfile": "./email_send.js",
"arg": {
"host": "smtp.office365.com",
"port": 587,
"ssl": false,
"starttls": true,
"user": "mailer@yourdomain.com",
"pass": "CHANGE_ME",
"from": {
"email": "mailer@yourdomain.com",
"name": "System Mailer"
},
"to": {
"email": "admin@example.com",
"name": "Admin"
},
"subject": "Alert: служба перезапущена",
"body": "MyService был автоматически перезапущен в 14:35."
}
}
email_send.js:
let r = send_email({
host: arg.host,
port: arg.port,
ssl: arg.ssl,
starttls: arg.starttls,
user: arg.user,
pass: arg.pass,
from: arg.from,
to: arg.to,
subject: arg.subject,
body: arg.body
});
if (r.code === 0) {
console.log("[OK] Email отправлен");
} else {
console.log("[ERROR]", r.error);
console.log("[SMTP LOG]", r.log);
}
JsN.exe CaEmail.json
Мониторинг + уведомления в одном скрипте
Расширенный пример: мониторинг с уведомлениями в Telegram при перезапуске.
monitor-with-notify.json:
{
"scriptfile": "./monitor_notify.js",
"arg": {
"process": "myapp.exe",
"service": "MyService",
"cpu_limit": 90,
"ram_limit_mb": 800,
"window_sec": 30,
"telegram_token": "BOT_TOKEN",
"telegram_chat": "CHAT_ID"
}
}
monitor_notify.js:
function sendTelegram(msg) {
let url = "https://api.telegram.org/bot" + arg.telegram_token +
"/sendMessage?chat_id=" + arg.telegram_chat +
"&text=" + encodeURIComponent(msg);
http_get(url);
}
var TICKS_PER_SEC = 5;
var overload_ticks = 0;
var window_ticks = arg.window_sec * TICKS_PER_SEC;
while (true) {
var f = proc_find(arg.process);
if (!f.found) {
console.log("[WARN] Процесс не найден:", arg.process);
overload_ticks = 0;
} else {
var pid = f.pid;
var cpu = proc_cpu(pid);
var ram = proc_ram(pid);
var live = proc_alive(pid);
if (!live.responding) {
var msg = "[ALERT] " + arg.process + " завис. Перезапуск службы " + arg.service;
console.log(msg);
sendTelegram(msg);
var r = svc_restart(arg.service);
var result = r.ok ? "Успешно" : "Ошибка: " + r.error;
sendTelegram("[INFO] Перезапуск: " + result);
overload_ticks = 0;
} else {
var overloaded = (cpu.cpu > arg.cpu_limit) || (ram.ram_mb > arg.ram_limit_mb);
if (overloaded) {
overload_ticks++;
if (overload_ticks >= window_ticks) {
var msg2 = "[ALERT] " + arg.process +
" перегружен (CPU:" + cpu.cpu.toFixed(0) + "% RAM:" + ram.ram_mb.toFixed(0) + "MB)" +
". Перезапуск службы " + arg.service;
console.log(msg2);
sendTelegram(msg2);
var r2 = svc_restart(arg.service);
sendTelegram("[INFO] Перезапуск: " + (r2.ok ? "OK" : r2.error));
overload_ticks = 0;
}
} else {
overload_ticks = 0;
}
}
}
}
Проверка одного процесса (не демон)
// check_process.js
var name = arg.process || "notepad.exe";
var f = proc_find(name);
if (!f.found) {
console.log("НЕ НАЙДЕН:", name);
} else {
var cpu = proc_cpu(f.pid);
var ram = proc_ram(f.pid);
var live = proc_alive(f.pid);
var svc = proc_service(f.pid);
console.log("Процесс:", name);
console.log("PID:", f.pid, f.pids.length > 1 ? "(+" + (f.pids.length - 1) + " ещё)" : "");
console.log("CPU:", cpu.cpu.toFixed(1) + "%");
console.log("RAM:", ram.ram_mb.toFixed(1) + " MB");
console.log("Жив:", live.alive, "| Отвечает:", live.responding);
if (svc.is_service) {
var s = svc_status(svc.service_name);
console.log("Служба:", svc.service_name, "— состояние:", s.state);
}
}
{
"scriptfile": "./check_process.js",
"arg": { "process": "chrome.exe" }
}