From 729d4b4ac96f9eba59d320d4aa4fdc773afd2114 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sun, 1 Feb 2026 01:12:36 +0800 Subject: [PATCH] add deno-process-mod.ts --- libraries/deno-process-mod.ts | 115 ++++++++++++++++++++++++++++ single-scripts/server-control.ts | 126 ++----------------------------- 2 files changed, 121 insertions(+), 120 deletions(-) create mode 100644 libraries/deno-process-mod.ts diff --git a/libraries/deno-process-mod.ts b/libraries/deno-process-mod.ts new file mode 100644 index 0000000..1e12dc7 --- /dev/null +++ b/libraries/deno-process-mod.ts @@ -0,0 +1,115 @@ +import {assertEquals} from "jsr:@std/assert"; +import {assert} from "jsr:@std/assert/assert"; + +export class Process { + user: string; + pid: number; + cpu: number; + mem: number; + vsz: number; + rss: number; + tty: string; + stat: string; + start: string; + time: string; + command: string; + constructor( + user: string, + pid: number, + cpu: number, + mem: number, + vsz: number, + rss: number, + tty: string, + stat: string, + start: string, + time: string, + command: string, + ) { + this.user = user; + this.pid = pid; + this.cpu = cpu; + this.mem = mem; + this.vsz = vsz; + this.rss = rss; + this.tty = tty; + this.stat = stat; + this.start = start; + this.time = time; + this.command = command; + } +} + +export function parseProcessLine(line: string): Process | null { + const processMatchRegex = + /^\s*([\w+\-_]+)\s+(\d+)\s+([\d.]+)\s+([\d.]+)\s+(\d+)\s+(\d+)\s+([\w\/\\?]+)\s+([\w+<>]+)\s+([\w:]+)\s+([\d:]+)\s+(.*)$/; + // "app 3622 0.2 24.0 2932504 453004 ? Sl Jan25 23:04 /usr/lib/jvm/jdk-25/bin/java -Dfastjson.parser.safeMode=true......"; + // USER PID CPU MEM VSZ RSS TTY STAT START TIME COMMAND + const matcher = line.match(processMatchRegex); + if (!matcher) { + return null; + } + const user = matcher[1]; + const pid = parseInt(matcher[2]); + const cpu = Number(matcher[3]); + const mem = Number(matcher[4]); + const vsz = parseInt(matcher[5]); + const rss = parseInt(matcher[6]); + const tty = matcher[7]; + const stat = matcher[8]; + const start = matcher[9]; + const time = matcher[10]; + const command = matcher[11]; + return new Process( + user, + pid, + cpu, + mem, + vsz, + rss, + tty, + stat, + start, + time, + command, + ); +} + +Deno.test("parseProcessLine", () => { + const p1 = parseProcessLine( + "app 3622 0.2 24.0 2932504 453004 ? Sl Jan25 23:04 /usr/lib/jvm/jdk-25/bin/java -Dfastjson.parser.safeMode=true......", + ); + if (p1 !== null) { + assertEquals("app", p1.user); + assertEquals(3622, p1.pid); + } else { + assert(false); + } + const p2 = parseProcessLine( + "root 10880 0.0 0.0 151104 1820 pts/2 R+ 23:17 0:00 ps aux", + ); + if (p2 !== null) { + assertEquals("root", p2.user); + assertEquals(10880, p2.pid); + } else { + assert(false); + } + const p3 = parseProcessLine( + "root 18 0.0 0.0 0 0 ? S< 2020 0:00 [kblockd]", + ); + if (p3 !== null) { + assertEquals("root", p3.user); + assertEquals(18, p3.pid); + } else { + assert(false); + } + const p4 = parseProcessLine( + "filebro+ 10377 0.0 0.6 1901492 12432 ? Sl 2024 25:15 /home/filebrowser/filebrowser", + ); + if (p4 !== null) { + assertEquals("filebro+", p4.user); + assertEquals(10377, p4.pid); + } else { + assert(false); + } +}); diff --git a/single-scripts/server-control.ts b/single-scripts/server-control.ts index 13c93f6..9fac11d 100755 --- a/single-scripts/server-control.ts +++ b/single-scripts/server-control.ts @@ -11,8 +11,7 @@ import { readFileToString, sleep, } from "https://global.hatter.ink/script/get/@24/deno-commons-mod.ts"; -import {assertEquals} from "jsr:@std/assert"; -import {assert} from "jsr:@std/assert/assert"; +import {parseProcessLine, Process,} from "https://global.hatter.ink/script/get/@0/deno-process-mod.ts"; import {fromFileUrl} from "https://deno.land/std/path/mod.ts"; interface HealthCheck { @@ -28,45 +27,6 @@ interface ServerControlConfig { healthCheck?: HealthCheck; } -class Process { - user: string; - pid: number; - cpu: number; - mem: number; - vsz: number; - rss: number; - tty: string; - stat: string; - start: string; - time: string; - command: string; - constructor( - user: string, - pid: number, - cpu: number, - mem: number, - vsz: number, - rss: number, - tty: string, - stat: string, - start: string, - time: string, - command: string, - ) { - this.user = user; - this.pid = pid; - this.cpu = cpu; - this.mem = mem; - this.vsz = vsz; - this.rss = rss; - this.tty = tty; - this.stat = stat; - this.start = start; - this.time = time; - this.command = command; - } -} - async function listJavaProcesses( serverControlConfig: ServerControlConfig, ): Promise { @@ -83,41 +43,6 @@ async function listJavaProcesses( }).filter((line) => line !== null); } -function parseProcessLine(line: string): Process | null { - const processMatchRegex = - /^\s*([\w+\-_]+)\s+(\d+)\s+([\d.]+)\s+([\d.]+)\s+(\d+)\s+(\d+)\s+([\w\/\\?]+)\s+([\w+<>]+)\s+([\w:]+)\s+([\d:]+)\s+(.*)$/; - // "app 3622 0.2 24.0 2932504 453004 ? Sl Jan25 23:04 /usr/lib/jvm/jdk-25/bin/java -Dfastjson.parser.safeMode=true......"; - // USER PID CPU MEM VSZ RSS TTY STAT START TIME COMMAND - const matcher = line.match(processMatchRegex); - if (!matcher) { - return null; - } - const user = matcher[1]; - const pid = parseInt(matcher[2]); - const cpu = Number(matcher[3]); - const mem = Number(matcher[4]); - const vsz = parseInt(matcher[5]); - const rss = parseInt(matcher[6]); - const tty = matcher[7]; - const stat = matcher[8]; - const start = matcher[9]; - const time = matcher[10]; - const command = matcher[11]; - return new Process( - user, - pid, - cpu, - mem, - vsz, - rss, - tty, - stat, - start, - time, - command, - ); -} - async function checkServerStarted( serverControlConfig: ServerControlConfig, ): Promise { @@ -230,11 +155,11 @@ async function handleRestart(serverControlConfig: ServerControlConfig) { async function main() { const args = Deno.args; if (args.length === 0) { - log.error("No args."); - console.log(""); - console.log("server-control.js status"); - console.log("server-control.js kill|stop"); - console.log("server-control.js re|restart"); + log.error(`No args. + +server-control.js status +server-control.js kill|stop +server-control.js re|restart`); return; } const serverControlConfig = await loadServerControlConfig(); @@ -262,42 +187,3 @@ async function main() { } main().catch((e) => log.error(e)); - -Deno.test("parseProcessLine", () => { - const p1 = parseProcessLine( - "app 3622 0.2 24.0 2932504 453004 ? Sl Jan25 23:04 /usr/lib/jvm/jdk-25/bin/java -Dfastjson.parser.safeMode=true......", - ); - if (p1 !== null) { - assertEquals("app", p1.user); - assertEquals(3622, p1.pid); - } else { - assert(false); - } - const p2 = parseProcessLine( - "root 10880 0.0 0.0 151104 1820 pts/2 R+ 23:17 0:00 ps aux", - ); - if (p2 !== null) { - assertEquals("root", p2.user); - assertEquals(10880, p2.pid); - } else { - assert(false); - } - const p3 = parseProcessLine( - "root 18 0.0 0.0 0 0 ? S< 2020 0:00 [kblockd]", - ); - if (p3 !== null) { - assertEquals("root", p3.user); - assertEquals(18, p3.pid); - } else { - assert(false); - } - const p4 = parseProcessLine( - "filebro+ 10377 0.0 0.6 1901492 12432 ? Sl 2024 25:15 /home/filebrowser/filebrowser", - ); - if (p4 !== null) { - assertEquals("filebro+", p4.user); - assertEquals(10377, p4.pid); - } else { - assert(false); - } -});