|
@@ -3,6 +3,7 @@ const fs = require('fs-extra');
|
|
|
const path = require('path');
|
|
|
const crypto = require('crypto');
|
|
|
const baseX = require('base-x');
|
|
|
+const pidusage = require('pidusage');
|
|
|
|
|
|
const BASE36 = '0123456789abcdefghijklmnopqrstuvwxyz';
|
|
|
const bs36 = baseX(BASE36);
|
|
@@ -46,10 +47,11 @@ async function touchFile(filename) {
|
|
|
}
|
|
|
|
|
|
function spawnProcess(cmd, opts) {
|
|
|
- let {args, killAfter, onData, abort} = opts;
|
|
|
+ let {args, killAfter, onData, onUsage, onUsageInterval, abort} = opts;
|
|
|
killAfter = (killAfter ? killAfter : 120);//seconds
|
|
|
onData = (onData ? onData : () => {});
|
|
|
args = (args ? args : []);
|
|
|
+ onUsageInterval = (onUsageInterval ? onUsageInterval : 30);//seconds
|
|
|
|
|
|
return new Promise((resolve, reject) => { (async() => {
|
|
|
let resolved = false;
|
|
@@ -76,9 +78,19 @@ function spawnProcess(cmd, opts) {
|
|
|
reject({status: 'error', error, stdout, stderr});
|
|
|
});
|
|
|
|
|
|
+ //ждем процесс, контролируем его работу раз в секунду
|
|
|
+ let onUsageCounter = onUsageInterval;
|
|
|
while (!resolved) {
|
|
|
await sleep(1000);
|
|
|
- killAfter -= 1;
|
|
|
+
|
|
|
+ onUsageCounter--;
|
|
|
+ if (onUsage && onUsageCounter <= 0) {
|
|
|
+ const stats = await pidusage(proc.pid);
|
|
|
+ onUsage(stats);
|
|
|
+ onUsageCounter = onUsageInterval;
|
|
|
+ }
|
|
|
+
|
|
|
+ killAfter--;
|
|
|
if (killAfter <= 0 || (abort && abort())) {
|
|
|
process.kill(proc.pid);
|
|
|
if (killAfter <= 0) {
|