原文發表在個人博客 Node.js 執行系統命令 | 以太空間html
咱們在使用Node.js的時候總有一些時候須要執行一些系統命令,與系統作一些交互,或者調用其餘語言,這個時候該怎麼作呢? 固然是使用child_process
模塊了,這個模塊翻譯過來就是子進程,固然正如其名,這個模塊主要是經過產生子進程來發揮做用,下面咱們就用實例來看一下。node
exec
與execSync
這是child_process
模塊裏面最簡單的函數,做用就是執行一個固定的系統命令api
const { exec } = require('child_process');
// 輸出當前目錄(不必定是代碼所在的目錄)下的文件和文件夾
exec('ls -l', (err, stdout, stderr) => {
if(err) {
console.log(err);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
})
複製代碼
exec
函數第一個參數是要執行的命令,的第二個函數是配置選項,第三個參數是回調函數,第二個參數中一個比較經常使用的就是子進程的工做目錄數組
const { exec } = require('child_process');
const path = require('path'):
// 在當前目錄下的scripts文件夾裏執行hexo g命令
exec('hexo g', { cwd: path.join(process.cwd(), 'scripts') }, (err, stdout, stderr) => {
if(err) {
console.log(err);
return;
}
console.log(`stdout: ${stdout}`);
});
複製代碼
execSync
是exec
的同步版本,不過不管是execSync
仍是exec
,獲得的結果都是字符串或者Buffer對象,通常須要進一步處理。hexo
請參考:
exec
具體配置,execSync
具體配置函數
execFile
與execFileSync
這兩個函數的做用是執行一個可執行文件,看下面的實例:ui
const { execFile, execFileSync } = require('child_process');
execFile('example.py', [], (err, stdout, stderr) => {
if(err) {
console.log(err);
return;
}
console.log(`stdout: ${stdout}`);
});
const stdout = execFileSync('node', ['-v']);
console.log(stdout);
複製代碼
跟exec
相似,第一個參數是要執行的文件路徑,第二個是參數數組,第三個是配置,第四個是回調函數,固然,除了第一個以外都是能夠省略的spa
注意:被執行的文件必定要有可執行權限,若是是相似
.py
類的特定語言的腳本,必定在開頭指定解釋器程序路徑命令行
請參考:execFile配置,execFileSync配置翻譯
spawn
與spawnSync
child_process
模塊中全部函數都是基於spawn
和spawnSync
函數的來實現的,換句話來講,spawn
和spawnSync
函數的配置是最徹底的,其它函數都是對其作了封裝和修改。下面咱們來重點講解一下: spawn
函數原型是這樣的:child_process.spawn(command[, args][, options])
它使用指定的命令行參數建立新進程,spawn 會返回一個帶有stdout和stderr流的對象。你能夠經過stdout流來讀取子進程返回給Node.js的數據。stdout擁有'data'
,'end'
以及通常流所具備的事件。當你想要子進程返回大量數據給Node時,好比說圖像處理,讀取二進制數據等等,你最好使用spawn方法
const {spawn} = require('child_process');
const fs = require('fs');
const spawnObj = spawn('ping', ['127.0.0.1'], {encoding: 'utf-8'});
spawnObj.stdout.on('data', function(chunk) {
console.log(chunk.toString());
});
spawnObj.stderr.on('data', (data) => {
console.log(data);
});
spawnObj.on('close', function(code) {
console.log('close code : ' + code);
})
spawnObj.on('exit', (code) => {
console.log('exit code : ' + code);
fs.close(fd, function(err) {
if(err) {
console.error(err);
}
});
});
複製代碼