[英]NodeJs execute command in background and forget
我有一個無休止的 NodeJS script.js
循環,我需要這個腳本在后台執行另一個腳本作為服務,它實際上是一個 WebSocket 服務。
var exec = require('child_process').exec;
exec('node bgService.js &');
所以現在兩個腳本都運行正常!
當我對script.js
執行Ctrl+C
時, bgService.js
腳本也從我不想的內存中刪除。
如何在后台運行某些東西而忘記?
您可以使用帶有detached
選項的child_process.spawn來做到這一點:
var spawn = require('child_process').spawn;
spawn('node', ['bgService.js'], {
detached: true
});
它將使子進程成為新進程組的領導者,因此在父進程退出后它將繼續運行。
但是默認情況下,父進程將等待分離的子進程退出,並且它也會監聽它的stdio
。 要將子進程與父進程完全分離,您應該:
stdio
與父進程分離,將其通過管道傳輸到某個文件或/dev/null
unref()
方法從父事件循環引用計數中刪除子進程這是一個這樣做的例子:
var spawn = require('child_process').spawn;
spawn('node', ['bgService.js'], {
stdio: 'ignore', // piping all stdio to /dev/null
detached: true
}).unref();
如果您不想丟失孩子的stdin
輸出,您可以將其通過管道傳輸到某個日志文件:
var fs = require('fs'),
spawn = require('child_process').spawn,
out = fs.openSync('./out.log', 'a'),
err = fs.openSync('./out.log', 'a');
spawn('node', ['bgService.js'], {
stdio: [ 'ignore', out, err ], // piping stdout and stderr to out.log
detached: true
}).unref();
有關更多信息,請參閱child_process.spawn
文檔
簡短回答:(tl;dr)
spawn('command', ['arg', ...],
{ stdio: 'ignore', detached: true }).unref()
需要unref
以防止父級等待。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.