Move from pid usage to `time`
This commit is contained in:
parent
32f082fab7
commit
bf50ab406b
|
@ -0,0 +1 @@
|
||||||
|
1. add time format line (https://www.man7.org/linux/man-pages/man1/time.1.html#top_of_page)
|
|
@ -4,8 +4,8 @@ ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
RUN dpkg-reconfigure -p critical dash
|
RUN dpkg-reconfigure -p critical dash
|
||||||
RUN for i in $(seq 1001 1500); do \
|
RUN for i in $(seq 1001 1500); do \
|
||||||
groupadd -g $i runner$i && \
|
groupadd -g $i runner$i && \
|
||||||
useradd -M runner$i -g $i -u $i ; \
|
useradd -M runner$i -g $i -u $i ; \
|
||||||
done
|
done
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y libxml2 gnupg tar coreutils util-linux libc6-dev \
|
apt-get install -y libxml2 gnupg tar coreutils util-linux libc6-dev \
|
||||||
|
@ -13,7 +13,7 @@ RUN apt-get update && \
|
||||||
libncurses6 libncurses5 libedit-dev libseccomp-dev rename procps python3 \
|
libncurses6 libncurses5 libedit-dev libseccomp-dev rename procps python3 \
|
||||||
libreadline-dev libblas-dev liblapack-dev libpcre3-dev libarpack2-dev \
|
libreadline-dev libblas-dev liblapack-dev libpcre3-dev libarpack2-dev \
|
||||||
libfftw3-dev libglpk-dev libqhull-dev libqrupdate-dev libsuitesparse-dev \
|
libfftw3-dev libglpk-dev libqhull-dev libqrupdate-dev libsuitesparse-dev \
|
||||||
libsundials-dev libpcre2-dev && \
|
libsundials-dev libpcre2-dev time && \
|
||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen
|
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen
|
||||||
|
|
|
@ -14,8 +14,7 @@
|
||||||
"node-fetch": "^2.6.1",
|
"node-fetch": "^2.6.1",
|
||||||
"semver": "^7.3.4",
|
"semver": "^7.3.4",
|
||||||
"uuid": "^8.3.2",
|
"uuid": "^8.3.2",
|
||||||
"waitpid": "git+https://github.com/HexF/node-waitpid.git",
|
"waitpid": "git+https://github.com/HexF/node-waitpid.git"
|
||||||
"pidusage": "^3.0.2"
|
|
||||||
},
|
},
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
}
|
}
|
|
@ -137,31 +137,6 @@ class Job {
|
||||||
this.logger.debug('Destroyed processes writables');
|
this.logger.debug('Destroyed processes writables');
|
||||||
}
|
}
|
||||||
|
|
||||||
get_stats(pid) {
|
|
||||||
// https://www.npmjs.com/package/pidusage
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
pidusage(pid, {
|
|
||||||
usePs: true,
|
|
||||||
}, (err, stat) => {
|
|
||||||
if (err) {
|
|
||||||
this.logger.debug(`Got error while getting stats:`, err);
|
|
||||||
} else {
|
|
||||||
let res = {
|
|
||||||
'cpu': stat.cpu,
|
|
||||||
'memory': stat.memory,
|
|
||||||
'ctime': stat.ctime,
|
|
||||||
'elapsed': stat.elapsed,
|
|
||||||
'timestamp': stat.timestamp,
|
|
||||||
};
|
|
||||||
|
|
||||||
this.logger.debug(`Got stats:`, res);
|
|
||||||
|
|
||||||
resolve(res);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async safe_call(file, args, timeout, memory_limit, event_bus = null) {
|
async safe_call(file, args, timeout, memory_limit, event_bus = null) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const nonetwork = config.disable_networking ? ['nosocket'] : [];
|
const nonetwork = config.disable_networking ? ['nosocket'] : [];
|
||||||
|
@ -180,6 +155,10 @@ class Job {
|
||||||
Math.ceil(timeout / 1000),
|
Math.ceil(timeout / 1000),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const time_format = [
|
||||||
|
'-p'
|
||||||
|
]
|
||||||
|
|
||||||
if (memory_limit >= 0) {
|
if (memory_limit >= 0) {
|
||||||
prlimit.push('--as=' + memory_limit);
|
prlimit.push('--as=' + memory_limit);
|
||||||
}
|
}
|
||||||
|
@ -189,6 +168,8 @@ class Job {
|
||||||
...timeout_call,
|
...timeout_call,
|
||||||
...prlimit,
|
...prlimit,
|
||||||
...nonetwork,
|
...nonetwork,
|
||||||
|
'time',
|
||||||
|
...time_format,
|
||||||
'bash',
|
'bash',
|
||||||
file,
|
file,
|
||||||
...args,
|
...args,
|
||||||
|
@ -197,7 +178,6 @@ class Job {
|
||||||
var stdout = '';
|
var stdout = '';
|
||||||
var stderr = '';
|
var stderr = '';
|
||||||
var output = '';
|
var output = '';
|
||||||
var stats = [];
|
|
||||||
|
|
||||||
var start_time = new Date().getTime();
|
var start_time = new Date().getTime();
|
||||||
|
|
||||||
|
@ -215,10 +195,6 @@ class Job {
|
||||||
|
|
||||||
this.#active_parent_processes.push(proc);
|
this.#active_parent_processes.push(proc);
|
||||||
|
|
||||||
this.get_stats(proc.pid).then(stat => {
|
|
||||||
stats.push(stat);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (event_bus === null) {
|
if (event_bus === null) {
|
||||||
proc.stdin.write(this.stdin);
|
proc.stdin.write(this.stdin);
|
||||||
proc.stdin.end();
|
proc.stdin.end();
|
||||||
|
@ -236,14 +212,6 @@ class Job {
|
||||||
const kill_timeout =
|
const kill_timeout =
|
||||||
(timeout >= 0 &&
|
(timeout >= 0 &&
|
||||||
set_timeout(async _ => {
|
set_timeout(async _ => {
|
||||||
try {
|
|
||||||
this.get_stats(proc.pid).then(stat => {
|
|
||||||
stats.push(stat);
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
this.logger.debug(`Got error while getting stats:`, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.logger.info(`Timeout exceeded timeout=${timeout}`);
|
this.logger.info(`Timeout exceeded timeout=${timeout}`);
|
||||||
try {
|
try {
|
||||||
process.kill(proc.pid, 'SIGKILL');
|
process.kill(proc.pid, 'SIGKILL');
|
||||||
|
@ -278,10 +246,6 @@ class Job {
|
||||||
stderr += data;
|
stderr += data;
|
||||||
output += data;
|
output += data;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.get_stats(proc.pid).then(stat => {
|
|
||||||
stats.push(stat);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
proc.stdout.on('data', async data => {
|
proc.stdout.on('data', async data => {
|
||||||
|
@ -303,10 +267,6 @@ class Job {
|
||||||
stdout += data;
|
stdout += data;
|
||||||
output += data;
|
output += data;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.get_stats(proc.pid).then(stat => {
|
|
||||||
stats.push(stat);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
proc.on('exit', () => this.exit_cleanup());
|
proc.on('exit', () => this.exit_cleanup());
|
||||||
|
@ -314,14 +274,17 @@ class Job {
|
||||||
proc.on('close', (code, signal) => {
|
proc.on('close', (code, signal) => {
|
||||||
this.close_cleanup();
|
this.close_cleanup();
|
||||||
|
|
||||||
if (stats.length !== 0) {
|
if (stderr.length > 0) {
|
||||||
stats = stats[stats.length - 1];
|
var stats = stderr.trim().split('\n').slice(-3).join('\n');
|
||||||
|
|
||||||
|
stderr = stderr.trim().split('\n').slice(0, -3).join('\n');
|
||||||
|
output = output.trim().split('\n').slice(0, -3).join('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
var end_time = new Date().getTime();
|
var end_time = new Date().getTime();
|
||||||
var exec_time = end_time - start_time;
|
var exec_time = end_time - start_time;
|
||||||
|
|
||||||
this.logger.debug(`Last stats:`, stats);
|
this.logger.debug(`Stats:`, stats);
|
||||||
resolve({ stdout, stderr, code, signal, output, stats, exec_time });
|
resolve({ stdout, stderr, code, signal, output, stats, exec_time });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -329,14 +292,17 @@ class Job {
|
||||||
this.exit_cleanup();
|
this.exit_cleanup();
|
||||||
this.close_cleanup();
|
this.close_cleanup();
|
||||||
|
|
||||||
if (stats.length !== 0) {
|
if (stderr.length > 0) {
|
||||||
stats = stats[stats.length - 1];
|
var stats = stderr.trim().split('\n').slice(-3).join('\n');
|
||||||
|
|
||||||
|
stderr = stderr.trim().split('\n').slice(0, -3).join('\n');
|
||||||
|
output = output.trim().split('\n').slice(0, -3).join('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
var end_time = new Date().getTime();
|
var end_time = new Date().getTime();
|
||||||
var exec_time = end_time - start_time;
|
var exec_time = end_time - start_time;
|
||||||
|
|
||||||
this.logger.debug(`Last stats:`, stats);
|
this.logger.debug(`Stats:`, stats);
|
||||||
reject({ error: err, stdout, stderr, output, stats, exec_time });
|
reject({ error: err, stdout, stderr, output, stats, exec_time });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue