nodejs新程序子程序
阿新 • • 發佈:2020-07-06
獲取程序相關的基本資訊
#!/bin/env node console.log (process.execPath) console.log (process.cwd()) console.log (process.pid) let user = process.env.USER || "" console.log (user) process.on('exit', function () { console.log('Bye.'); }); process.on('uncaughtException', function (err) { console.log('Caught exception: ' + err); });
啟動程序的各種方法的比較
- child_process.spawn() 方法會非同步地衍生子程序,且不阻塞 Node.js 事件迴圈。 child_process.spawnSync() 函式則以同步的方式提供了等效的功能,但會阻塞事件迴圈直到衍生的程序退出或被終止。
- child_process.exec(): 衍生 shell 並且在 shell 中執行命令,當完成時則將 stdout 和 stderr 傳給回撥函式。
- child_process.execFile(): 類似於 child_process.exec(),但是預設情況下它會直接衍生命令而不先衍生 shell,由於沒有衍生 shell,因此不支援 I/O 重定向和檔案通配等行為。
- child_process.fork(): 衍生新的 Node.js 程序,並呼叫指定的模組,該模組已建立了 IPC 通訊通道,可以在父程序與子程序之間傳送訊息。
- child_process.execSync(): child_process.exec() 的同步版本,會阻塞 Node.js 事件迴圈。
- child_process.execFileSync(): child_process.execFile() 的同步版本,會阻塞 Node.js 事件迴圈。
以非常精細的方式執行 ps ax | grep ssh
const { spawn } = require('child_process'); const ps = spawn('ps', ['ax']); const grep = spawn('grep', ['ssh']); ps.stdout.on('data', (data) => { grep.stdin.write(data); }); ps.stderr.on('data', (data) => { console.error(`ps 的 stderr: ${data}`); }); ps.on('close', (code) => { if (code !== 0) { console.log(`ps 程序退出,退出碼 ${code}`); } grep.stdin.end(); }); grep.stdout.on('data', (data) => { console.log(data.toString()); }); grep.stderr.on('data', (data) => { console.error(`grep 的 stderr: ${data}`); }); grep.on('close', (code) => { if (code !== 0) { console.log(`grep 程序退出,退出碼 ${code}`); } }); //------------------------------------- const { spawn } = require('child_process'); const grep = spawn('grep', ['ssh']); grep.on('close', (code, signal) => { console.log(`子程序因收到訊號 ${signal} 而終止`); }); // 傳送 SIGHUP 到程序。 grep.kill('SIGHUP');