add deno-process-mod.ts

This commit is contained in:
2026-02-01 01:12:36 +08:00
parent 23fd23bb75
commit 729d4b4ac9
2 changed files with 121 additions and 120 deletions

View File

@@ -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);
}
});

View File

@@ -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<Process[]> {
@@ -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<boolean> {
@@ -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);
}
});