獲取進程相關的基本信息
#!/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');