在后台使用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议可能的方法来实现这一点。

  • 如何将函数/callback传递给Node.js中的subprocess?
  • 如何读取stdio的child_process.spawnSync stdout选项“inheritance”
  • NodeJS:从进程ID获取进程信息
  • 儿童大量使用后死亡
  • 节点:child_process.exec()进程在父进程死亡后继续
  • 从生成的节点进程中捕获ECONNRESET错误
  • node.js在subprocess中运行函数?
  • Node.js中的subprocess之间的通信
  • 不要在命令行参数中使用& (&符号)。 它由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}`); });