簡體   English   中英

NodeJs 在后台執行命令並忘記

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM