在后台使用child_process(node js)运行python脚本

我有一个python脚本test.py在一个树莓派需要在后台运行。 使用CLI,我这样做:

python test.py & 

但是,如何使用节点js中的child_process执行相同操作。

 var spawn = require("child_process").spawn; var process = spawn("python",["/path/to/test.py", "&"]); 

我有这个代码,这似乎是行不通的。 请build议可能的方法来实现这一点。

不要在命令行参数中使用& (&符号)。 它由shell使用,而不是由python使用。

使用{detached: true}选项,以便在Node进程退出时能够运行:

 var spawn = require("child_process").spawn; var p = spawn("python", ["/path/to/test.py"], {detached: true}); 

如果你还想知道它的输出,使用{stdio: 'ignore'}

 var spawn = require("child_process").spawn; var p = spawn("python", ["/path/to/test.py"], {detached: true, stdio: 'ignore'}); 

另外,我不会将variablesprocess命名为节点:

进程对象是一个全局的对象,提供有关当前Node.js进程的信息,并对其进行控制。 作为一个全局的,Node.js应用程序总是可以使用,而不使用require()。

请参阅: https : //nodejs.org/api/process.html#process_process

更新

如果仍然不能退出,请尝试添加:

 p.unref(); 

到你的程序中,其中pspawn返回的内容:

 var spawn = require("child_process").spawn; var p = spawn("python", ["/path/to/test.py"], {detached: true, stdio: 'ignore'}); p.unref(); 

更新2

这里是一个shell会话的例子 – 如何运行它,testing它是否工作并杀死它:

 $ cat parent.js var spawn = require("child_process").spawn; var fs = require("fs"); var p = spawn("sh", ["child.sh"], {detached: true, stdio: 'ignore'}); p.unref(); $ cat child.sh #!/bin/sh sleep 60 $ node parent.js $ ps x | grep child.sh 11065 ? Ss 0:00 sh child.sh 11068 pts/28 S+ 0:00 grep child.sh $ kill 11065 $ ps x | grep child.sh 11070 pts/28 S+ 0:00 grep child.sh $ 

你不应该这样做。 stream程应该由一个真正的stream程pipe理者来处理。

如果你想运行后台进程,你应该看看如何在Raspberry Pi中运行服务。 这取决于正在Raspberry Pi上运行的Linux发行版( Upstart (像Debian)或systemd (像CentOS))

但是无论如何,从文档引用一个例子:

 const spawn = require('child_process').spawn; const ls = spawn('ls', ['-lh', '/usr']); ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); ls.stderr.on('data', (data) => { console.log(`stderr: ${data}`); }); ls.on('close', (code) => { console.log(`child process exited with code ${code}`); });