diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/Readme b/Readme deleted file mode 100644 index a57a248..0000000 --- a/Readme +++ /dev/null @@ -1 +0,0 @@ -作业 diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..6ad28cc --- /dev/null +++ b/Readme.md @@ -0,0 +1,5 @@ +hotload: +下列所有路径为hotload所在位置的相对路径 +--file: 监听的文件改动会重新reload 这个文件 // 默认./src/app.js +--watchDir: 你想监听哪个文件夹下的文件(会递归所有文件) // 默认src +--delay: 在--delay时间内保存多次只会执行一次(ms) \ No newline at end of file diff --git a/hotload.js b/hotload.js new file mode 100644 index 0000000..a75ff07 --- /dev/null +++ b/hotload.js @@ -0,0 +1,85 @@ +const path = require('path') +const fs = require('fs') +const process = require('process') +const spawn = require('child_process').spawn +/** + * 可以接收三个参数 + * --file: 监听的文件改动会重新reload 这个文件 // 默认./src/app.js + * --watchDir: 你想监听哪个文件夹下的文件(会递归所有文件) // 默认src + * --delay: 在--delay时间内保存多次只会执行一次(ms) // 默认2000ms + */ +class MyHotLoad { + constructor() { + this.myProcess = null // 已经创建好的子进程(reload前要kill掉,否则会端口占用) + this['--watchdir'] = 'src' // 要监听的文件里js文件 + this['--file'] = './src/app.js' // 监听的文件改动reload这个文件 + this['--delay'] = 2000 // 默认两秒之内多个文件改动,最后一次改动有效 + this.timer = null + } + init() { + this.setParams() + this.exec() + this.deepDir(path.join(__dirname, this['--watchdir'])) + } + // 需要接收更多参数在p数组里添加key + // 返回类似: { '--file': './src/app.js', '--watchdir': 'src' } + setParams() { + let objKeys = Object.keys(this) + let arr = process.argv.slice(2) + arr.reduce((pre, cur) => { + if (objKeys.indexOf(pre) > -1) { + this[pre] = cur + } + }) + } + // 遍历目录: 监听src目录下所有文件改动 + deepDir(currentDir) { + fs.readdir(currentDir, (err, files) => { + if (err) {console.log(err);return} + files.forEach(file => { + fs.stat(path.join(currentDir, file), (err, stat) => { + if (err) throw err; + if (stat.isFile()) { // 文件 + this.watch(path.join(currentDir, file)) + // fileArr.push(path.join(currentDir, file)) + } else { // 目录 + this.deepDir(path.join(currentDir, file)) + } + }) + }) + }) + } + exec() { + if (this.myProcess) { // 结束掉上一个进程,因为端口相同会报错 + this.myProcess.kill('SIGKILL') + } + this.myProcess = spawn('node', [this['--file']]) + + // 捕获stdout和stderr(否则监听文件里的日志打印和报错显示不出来) + // 这里返回的是buffer + // 坑: windows下竟然执行两次 + this.myProcess.stdout.on('data', (data) => { + console.log(data.toString()) + }) + // 监听的文件出错会执行 + this.myProcess.stderr.on('data', (data) => { + console.log(`stderr: ${data}`); + }); + + // this.myProcess.kill()会触发这个事件 + this.myProcess.on('close', (err) => { + err && console.log(err) + }) + } + // 2s内修改了多个文件只会执行一次 + watch(file) { + fs.watch(file, () => { + clearTimeout(this.timer) + this.timer = setTimeout(() => { + console.log('reload...') + this.exec() + }, this['--delay']); + }) + } +} +new MyHotLoad().init() \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..92666d6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,333 @@ +{ + "name": "nodejs", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "http://r.cnpmjs.org/accepts/download/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "http://r.cnpmjs.org/any-promise/download/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "cache-content-type": { + "version": "1.0.1", + "resolved": "http://r.cnpmjs.org/cache-content-type/download/cache-content-type-1.0.1.tgz", + "integrity": "sha1-A1zeKwjuISn0qDFeqPAKANuhRTw=", + "requires": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "http://r.cnpmjs.org/co/download/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "http://r.cnpmjs.org/content-disposition/download/content-disposition-0.5.3.tgz", + "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "http://r.cnpmjs.org/content-type/download/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" + }, + "cookies": { + "version": "0.7.3", + "resolved": "http://r.cnpmjs.org/cookies/download/cookies-0.7.3.tgz", + "integrity": "sha1-eRLOIfvy6MLacM8cPzUa7PWdrfo=", + "requires": { + "depd": "~1.1.2", + "keygrip": "~1.0.3" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "http://r.cnpmjs.org/debug/download/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "requires": { + "ms": "2.0.0" + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "http://r.cnpmjs.org/deep-equal/download/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "http://r.cnpmjs.org/delegates/download/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "http://r.cnpmjs.org/depd/download/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "http://r.cnpmjs.org/destroy/download/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "http://r.cnpmjs.org/ee-first/download/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "error-inject": { + "version": "1.0.0", + "resolved": "http://r.cnpmjs.org/error-inject/download/error-inject-1.0.0.tgz", + "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "http://r.cnpmjs.org/escape-html/download/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "http://r.cnpmjs.org/fresh/download/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "http-assert": { + "version": "1.4.1", + "resolved": "http://r.cnpmjs.org/http-assert/download/http-assert-1.4.1.tgz", + "integrity": "sha1-xfcl1neqfoc+9zYZm4lobM6zeHg=", + "requires": { + "deep-equal": "~1.0.1", + "http-errors": "~1.7.2" + } + }, + "http-errors": { + "version": "1.7.3", + "resolved": "http://r.cnpmjs.org/http-errors/download/http-errors-1.7.3.tgz", + "integrity": "sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "http://r.cnpmjs.org/inherits/download/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" + }, + "is-generator-function": { + "version": "1.0.7", + "resolved": "http://r.cnpmjs.org/is-generator-function/download/is-generator-function-1.0.7.tgz", + "integrity": "sha1-0hMuUpuwAAp/gHlNS99c1eWBNSI=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "http://r.cnpmjs.org/isarray/download/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "keygrip": { + "version": "1.0.3", + "resolved": "http://r.cnpmjs.org/keygrip/download/keygrip-1.0.3.tgz", + "integrity": "sha1-OZ1wnwrtK6sKBZ4M3TpQI6BT4dw=" + }, + "koa": { + "version": "2.7.0", + "resolved": "http://r.cnpmjs.org/koa/download/koa-2.7.0.tgz", + "integrity": "sha1-fgCENQaUK52CxswzdJ9lfG5eet8=", + "requires": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.7.1", + "debug": "~3.1.0", + "delegates": "^1.0.0", + "depd": "^1.1.2", + "destroy": "^1.0.4", + "error-inject": "^1.0.0", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^1.2.0", + "koa-is-json": "^1.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + } + }, + "koa-compose": { + "version": "4.1.0", + "resolved": "http://r.cnpmjs.org/koa-compose/download/koa-compose-4.1.0.tgz", + "integrity": "sha1-UHMGuTcZAdtBEhyBLpI9DWfT6Hc=" + }, + "koa-convert": { + "version": "1.2.0", + "resolved": "http://r.cnpmjs.org/koa-convert/download/koa-convert-1.2.0.tgz", + "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "requires": { + "co": "^4.6.0", + "koa-compose": "^3.0.0" + }, + "dependencies": { + "koa-compose": { + "version": "3.2.1", + "resolved": "http://r.cnpmjs.org/koa-compose/download/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "requires": { + "any-promise": "^1.1.0" + } + } + } + }, + "koa-is-json": { + "version": "1.0.0", + "resolved": "http://r.cnpmjs.org/koa-is-json/download/koa-is-json-1.0.0.tgz", + "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" + }, + "koa-router": { + "version": "7.4.0", + "resolved": "http://r.cnpmjs.org/koa-router/download/koa-router-7.4.0.tgz", + "integrity": "sha1-ruH3rcAtXLMdfWdGXJ6syCXoxeA=", + "requires": { + "debug": "^3.1.0", + "http-errors": "^1.3.1", + "koa-compose": "^3.0.0", + "methods": "^1.0.1", + "path-to-regexp": "^1.1.1", + "urijs": "^1.19.0" + }, + "dependencies": { + "koa-compose": { + "version": "3.2.1", + "resolved": "http://r.cnpmjs.org/koa-compose/download/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "requires": { + "any-promise": "^1.1.0" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "http://r.cnpmjs.org/media-typer/download/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "methods": { + "version": "1.1.2", + "resolved": "http://r.cnpmjs.org/methods/download/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "http://r.cnpmjs.org/mime-db/download/mime-db-1.40.0.tgz", + "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "http://r.cnpmjs.org/mime-types/download/mime-types-2.1.24.tgz", + "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=", + "requires": { + "mime-db": "1.40.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "http://r.cnpmjs.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "http://r.cnpmjs.org/negotiator/download/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "http://r.cnpmjs.org/on-finished/download/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "only": { + "version": "0.0.2", + "resolved": "http://r.cnpmjs.org/only/download/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "http://r.cnpmjs.org/parseurl/download/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "http://r.cnpmjs.org/path-to-regexp/download/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "http://r.cnpmjs.org/safe-buffer/download/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "http://r.cnpmjs.org/setprototypeof/download/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" + }, + "statuses": { + "version": "1.5.0", + "resolved": "http://r.cnpmjs.org/statuses/download/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "http://r.cnpmjs.org/toidentifier/download/toidentifier-1.0.0.tgz", + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" + }, + "type-is": { + "version": "1.6.18", + "resolved": "http://r.cnpmjs.org/type-is/download/type-is-1.6.18.tgz", + "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "urijs": { + "version": "1.19.1", + "resolved": "http://r.cnpmjs.org/urijs/download/urijs-1.19.1.tgz", + "integrity": "sha1-Ww/1MMDL3oOG9jQiNbpcpumV0lo=" + }, + "vary": { + "version": "1.1.2", + "resolved": "http://r.cnpmjs.org/vary/download/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "ylru": { + "version": "1.2.1", + "resolved": "http://r.cnpmjs.org/ylru/download/ylru-1.2.1.tgz", + "integrity": "sha1-9Xa2M0FUeYnB3nuiiHYJI7J/6E8=" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..83887bd --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "nodejs", + "version": "1.0.0", + "description": "koa and deamon", + "main": "app.js", + "scripts": { + "start": "node hotload.js --file ./src/index.js --watchdir src", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tovinping/homework-nodejs.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/tovinping/homework-nodejs/issues" + }, + "homepage": "https://github.com/tovinping/homework-nodejs#readme", + "dependencies": { + "koa": "^2.7.0", + "koa-router": "^7.4.0" + } +} diff --git a/src/hotReload.png b/src/hotReload.png new file mode 100644 index 0000000..464b624 Binary files /dev/null and b/src/hotReload.png differ diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..a5cb3ed --- /dev/null +++ b/src/index.js @@ -0,0 +1,10 @@ +const Koa = require('koa'); +const app = new Koa(); +const Router = require('koa-router'); +const routers = require('./router') + +const router = new Router(); +router.get('/device', routers.device) +app.use(router.routes()) +console.log('opend: http://localhost:3000') +app.listen(3000); \ No newline at end of file diff --git a/src/result.png b/src/result.png new file mode 100644 index 0000000..130d180 Binary files /dev/null and b/src/result.png differ diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..1b39fee --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,15 @@ +const tools = require('../tools') +const os = require('os') +module.exports.device = async function (ctx, next) { + let systemInfo = { + '系统类型': os.platform(), + 'CPU型号': os.cpus()[0].model, + '总内存': (os.totalmem() / (1024 * 1024 * 1024)).toFixed(2) + ' GB', + '空闲内存': (os.freemem() / (1024 * 1024 * 1024)).toFixed(2) + ' GB' + } + const processList = await tools.getProcessList() + ctx.body = { + systemInfo, + processList + } +} diff --git a/src/testDir/1/2/test2.js b/src/testDir/1/2/test2.js new file mode 100644 index 0000000..3949fe6 --- /dev/null +++ b/src/testDir/1/2/test2.js @@ -0,0 +1 @@ +console.log('bbg') \ No newline at end of file diff --git a/src/testDir/1/test1.js b/src/testDir/1/test1.js new file mode 100644 index 0000000..7ffbabf --- /dev/null +++ b/src/testDir/1/test1.js @@ -0,0 +1 @@ +var s='ddd' \ No newline at end of file diff --git a/src/testDir/ps.txt b/src/testDir/ps.txt new file mode 100644 index 0000000..b23f811 --- /dev/null +++ b/src/testDir/ps.txt @@ -0,0 +1,91 @@ +USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND +root 1 0.0 0.5 128028 6592 ? Ss 00:40 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 +root 2 0.0 0.0 0 0 ? S 00:40 0:00 [kthreadd] +root 3 0.0 0.0 0 0 ? S 00:40 0:00 [ksoftirqd/0] +root 5 0.0 0.0 0 0 ? S< 00:40 0:00 [kworker/0:0H] +root 6 0.0 0.0 0 0 ? S 00:40 0:00 [kworker/u2:0] +root 7 0.0 0.0 0 0 ? S 00:40 0:00 [migration/0] +root 8 0.0 0.0 0 0 ? S 00:40 0:00 [rcu_bh] +root 9 0.0 0.0 0 0 ? R 00:40 0:01 [rcu_sched] +root 10 0.0 0.0 0 0 ? S< 00:40 0:00 [lru-add-drain] +root 11 0.0 0.0 0 0 ? S 00:40 0:00 [watchdog/0] +root 13 0.0 0.0 0 0 ? S 00:40 0:00 [kdevtmpfs] +root 14 0.0 0.0 0 0 ? S< 00:40 0:00 [netns] +root 15 0.0 0.0 0 0 ? S 00:40 0:00 [khungtaskd] +root 16 0.0 0.0 0 0 ? S< 00:40 0:00 [writeback] +root 17 0.0 0.0 0 0 ? S< 00:40 0:00 [kintegrityd] +root 18 0.0 0.0 0 0 ? S< 00:40 0:00 [bioset] +root 19 0.0 0.0 0 0 ? S< 00:40 0:00 [bioset] +root 20 0.0 0.0 0 0 ? S< 00:40 0:00 [bioset] +root 21 0.0 0.0 0 0 ? S< 00:40 0:00 [kblockd] +root 22 0.0 0.0 0 0 ? S< 00:40 0:00 [md] +root 23 0.0 0.0 0 0 ? S< 00:40 0:00 [edac-poller] +root 24 0.0 0.0 0 0 ? S< 00:40 0:00 [watchdogd] +root 30 0.0 0.0 0 0 ? S 00:40 0:00 [kswapd0] +root 31 0.0 0.0 0 0 ? SN 00:40 0:00 [ksmd] +root 32 0.0 0.0 0 0 ? SN 00:40 0:00 [khugepaged] +root 33 0.0 0.0 0 0 ? S< 00:40 0:00 [crypto] +root 41 0.0 0.0 0 0 ? S< 00:40 0:00 [kthrotld] +root 43 0.0 0.0 0 0 ? S< 00:40 0:00 [kmpath_rdacd] +root 44 0.0 0.0 0 0 ? S< 00:40 0:00 [kaluad] +root 45 0.0 0.0 0 0 ? S< 00:40 0:00 [kpsmoused] +root 46 0.0 0.0 0 0 ? S< 00:40 0:00 [ipv6_addrconf] +root 59 0.0 0.0 0 0 ? S< 00:40 0:00 [deferwq] +root 90 0.0 0.0 0 0 ? S 00:40 0:00 [kauditd] +root 720 0.0 0.0 0 0 ? S< 00:40 0:00 [hv_vmbus_con] +root 1041 0.0 0.0 0 0 ? S 00:40 0:00 [scsi_eh_0] +root 1049 0.0 0.0 0 0 ? S< 00:40 0:00 [scsi_tmf_0] +root 1058 0.0 0.0 0 0 ? S< 00:40 0:00 [storvsc_error_w] +root 1064 0.0 0.0 0 0 ? S 00:40 0:00 [kworker/u2:2] +root 1200 0.0 0.0 0 0 ? S< 00:40 0:00 [kdmflush] +root 1201 0.0 0.0 0 0 ? S< 00:40 0:00 [bioset] +root 1214 0.0 0.0 0 0 ? S< 00:40 0:00 [kdmflush] +root 1215 0.0 0.0 0 0 ? S< 00:40 0:00 [bioset] +root 1234 0.0 0.0 0 0 ? S< 00:40 0:00 [bioset] +root 1239 0.0 0.0 0 0 ? S< 00:40 0:00 [xfsalloc] +root 1244 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs_mru_cache] +root 1247 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-buf/dm-0] +root 1250 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-data/dm-0] +root 1253 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-conv/dm-0] +root 1254 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-cil/dm-0] +root 1255 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-reclaim/dm-] +root 1256 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-log/dm-0] +root 1257 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-eofblocks/d] +root 1258 0.0 0.0 0 0 ? S 00:40 0:00 [xfsaild/dm-0] +root 1259 0.0 0.0 0 0 ? S< 00:40 0:00 [kworker/0:1H] +root 1326 0.0 0.1 36816 2404 ? Ss 00:40 0:00 /usr/lib/systemd/systemd-journald +root 1347 0.0 0.4 127372 5488 ? Ss 00:40 0:00 /usr/sbin/lvmetad -f +root 1355 0.0 0.3 47444 4896 ? Ss 00:40 0:00 /usr/lib/systemd/systemd-udevd +root 1944 0.0 0.0 0 0 ? S 00:40 0:00 [hv_balloon] +root 2205 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-buf/sda2] +root 2216 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-data/sda2] +root 2220 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-conv/sda2] +root 2227 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-cil/sda2] +root 2233 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-reclaim/sda] +root 2237 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-log/sda2] +root 2245 0.0 0.0 0 0 ? S< 00:40 0:00 [xfs-eofblocks/s] +root 2274 0.0 0.0 0 0 ? S 00:40 0:00 [xfsaild/sda2] +root 2337 0.0 0.0 62044 1088 ? S { + let arr = [] + let isLiunx = os.platform() === 'linux' + if (isLiunx) { + exec('ps aux', (err, stdout, stderr) => { + stdout.split('\n').forEach(line => { + let lArr = line.split(/\s+/) + if (parseInt(lArr[1])) { + arr.push({'PID': lArr[1], 'CPU': lArr[2], 'MEM': lArr[3], 'COMMAND': lArr[10]}) + } + }) + arr.sort((a, b) => { + return b['CPU'] - a['CPU'] + }) + resolve(arr) + }) + } else { + exec('tasklist', (err, stdout, stderr) => { + if (err) throw err; + stdout.split('\n').forEach(line => { + let lArr = line.split(/\s{2}/) // '2': windows下面进程名称有空格: System Idle Process + let fArr = lArr.filter(item => item !== '') + // 过滤一些不需要的东西,比如内存占用为0的和可能发生错误的 + if (fArr[0] && fArr[1] && (fArr[3] && parseInt(fArr[3].trim()) > 0)) { + arr.push({'NAME': fArr[0], 'PID': fArr[1].trim().split(' ')[0], 'MEM': fArr[3].trim()}) + } + }); + arr.sort((a, b) => { + // 这时的内存值可能是这样:40,324 K (有逗号) + // b在前是降序,a在前是升序 + return parseInt(b['MEM'].replace(',', '')) - parseInt(a['MEM'].replace(',', '')) + }); + resolve(arr) + }) + } + }) +} \ No newline at end of file