Esimerkit

Valmiita konfiguraatioita ja skriptejä yleisiin tehtäviin.


Prosessiseuranta automaattisella uudelleenkäynnistyksellä

Useiden prosessien jatkuva seuranta. Jos CPU/RAM-kynnysarvot ylittyvät tai prosessi jumittuu — palvelu käynnistetään uudelleen automaattisesti.

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 tikkiä sekunnissa (200ms per proc_cpu)

// Ylikuormituslaskurit jokaiselle monitorille
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;

        // Etsi prosessi
        var f = proc_find(m.name);
        if (!f.found) {
            console.log("[VAROITUS]", m.name, "— ei löytynyt");
            overload_ticks[i] = 0;
            continue;
        }

        var pid = f.pid;

        // Kerää mittaukset (proc_cpu estää 200ms — luonnollinen tikki)
        var cpu  = proc_cpu(pid);
        var ram  = proc_ram(pid);
        var live = proc_alive(pid);

        // Tarkista jumittuminen
        if (!live.responding) {
            console.log("[TOIMINTO] Prosessi jumissa:", m.name, "PID:", pid);
            var r = svc_restart(m.service);
            console.log("Uudelleenkäynnistys:", r.ok ? "OK" : r.error);
            overload_ticks[i] = 0;
            continue;
        }

        // Tarkista kynnysarvot
        var overloaded = (cpu.cpu > m.cpu_limit) || (ram.ram_mb > m.ram_limit_mb);

        if (overloaded) {
            overload_ticks[i]++;
            console.log("[VAROITUS]", m.name,
                "CPU:", cpu.cpu.toFixed(1) + "%",
                "RAM:", ram.ram_mb.toFixed(1) + "MB",
                "| Ylikuormitus:", overload_ticks[i] + "/" + window_ticks + " tikkiä"
            );

            if (overload_ticks[i] >= window_ticks) {
                console.log("[TOIMINTO] Käynnistetään palvelu uudelleen:", m.service);
                var r2 = svc_restart(m.service);
                console.log("Tulos:", r2.ok ? "OK" : r2.error);
                overload_ticks[i] = 0;
            }
        } else {
            // Nollaa laskuri kun palautuu normaaliksi
            if (overload_ticks[i] > 0) {
                console.log("[OK]", m.name, "— kuormitus on normaali");
            }
            overload_ticks[i] = 0;
        }
    }
}
JsN.exe CaMonitor.json

Discord-ilmoitus

CaDiscord.json:

{
  "scriptfile": "./discord_send.js",
  "arg": {
    "discord_url": "https://discord.com/api/webhooks/1234567890/TOKEN",
    "message": "Palvelu MyApp käynnistettiin uudelleen kello 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("[VIRHE] Verkkovirhe:", r.error);
} else if (r.status === 204) {
    console.log("[OK] Viesti lähetetty Discordiin");
} else {
    console.log("[VIRHE] HTTP", r.status, ":", r.body);
}
JsN.exe CaDiscord.json

Slack-ilmoitus

CaSlack.json:

{
  "scriptfile": "./slack_send.js",
  "arg": {
    "slack_url": "https://hooks.slack.com/services/T.../B.../...",
    "message": "Palvelu MyApp käynnistettiin uudelleen"
  }
}

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("[VIRHE]", r.error);
} else if (r.status === 200) {
    console.log("[OK] Viesti lähetetty Släckiin");
} else {
    console.log("[VIRHE] HTTP", r.status);
}
JsN.exe CaSlack.json

Telegram-ilmoitus

CaTelegram.json:

{
  "scriptfile": "./telegram_send.js",
  "arg": {
    "token": "1234567890:ABCDEFGhijklmnopqrstuvwxyz",
    "chat": "-1001234567890",
    "message": "Palvelu MyApp käynnistettiin uudelleen"
  }
}

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("[VIRHE]", r.error);
} else {
    let resp = JSON.parse(r.body);
    if (resp.ok) {
        console.log("[OK] Viesti lähetetty Telegramiin");
    } else {
        console.log("[VIRHE]", resp.description);
    }
}
JsN.exe CaTelegram.json

Sähköpostin lähetys

CaEmail.json:

{
  "scriptfile": "./email_send.js",
  "arg": {
    "host": "smtp.office365.com",
    "port": 587,
    "ssl": false,
    "starttls": true,
    "user": "mailer@yourdomain.com",
    "pass": "VAIHDA_MINUT",
    "from": {
      "email": "mailer@yourdomain.com",
      "name": "Järjestelmäpostittaja"
    },
    "to": {
      "email": "admin@example.com",
      "name": "Ylläpitäjä"
    },
    "subject": "Hälytys: palvelu käynnistettiin uudelleen",
    "body": "MyService käynnistettiin automaattisesti uudelleen kello 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] Sähköposti lähetetty");
} else {
    console.log("[VIRHE]", r.error);
    console.log("[SMTP-LOKI]", r.log);
}
JsN.exe CaEmail.json

Seuranta + ilmoitukset yhdessä skriptissä

Laajennettu esimerkki: seuranta Telegram-ilmoituksilla uudelleenkäynnistyksen yhteydessä.

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("[VAROITUS] Prosessia ei löytynyt:", 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 = "[HÄLYTYS] " + arg.process + " on jumissa. Käynnistetään palvelu " + arg.service + " uudelleen";
            console.log(msg);
            sendTelegram(msg);

            var r = svc_restart(arg.service);
            var result = r.ok ? "Onnistui" : "Virhe: " + r.error;
            sendTelegram("[TIETO] Uudelleenkäynnistys: " + 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 = "[HÄLYTYS] " + arg.process +
                               " ylikuormitettu (CPU:" + cpu.cpu.toFixed(0) + "% RAM:" + ram.ram_mb.toFixed(0) + "MB)" +
                               ". Käynnistetään palvelu " + arg.service + " uudelleen";
                    console.log(msg2);
                    sendTelegram(msg2);

                    var r2 = svc_restart(arg.service);
                    sendTelegram("[TIETO] Uudelleenkäynnistys: " + (r2.ok ? "OK" : r2.error));
                    overload_ticks = 0;
                }
            } else {
                overload_ticks = 0;
            }
        }
    }
}

Yksittäinen prosessitarkistus (ei taustaprosessi)

// check_process.js
var name = arg.process || "notepad.exe";

var f = proc_find(name);
if (!f.found) {
    console.log("EI LÖYTYNYT:", 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("Prosessi:", name);
    console.log("PID:", f.pid, f.pids.length > 1 ? "(+" + (f.pids.length - 1) + " muuta)" : "");
    console.log("CPU:", cpu.cpu.toFixed(1) + "%");
    console.log("RAM:", ram.ram_mb.toFixed(1) + " MB");
    console.log("Elossa:", live.alive, "| Vastaava:", live.responding);

    if (svc.is_service) {
        var s = svc_status(svc.service_name);
        console.log("Palvelu:", svc.service_name, "— tila:", s.state);
    }
}
{
  "scriptfile": "./check_process.js",
  "arg": { "process": "chrome.exe" }
}