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

时间:2016-06-30 15:40:41

标签: python node.js raspberry-pi child-process

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

python test.py &

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

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

我有这个代码,这似乎无法正常工作。请提供可行的方法来实现这一目标。

2 个答案:

答案 0 :(得分:2)

你不应该这样做。流程应由真实的流程经理处理。

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

但无论如何,引用documentation中的一个例子:

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}`);
});

答案 1 :(得分:1)

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

使用{detached: true}选项,以便在您的节点进程退出时能够生效:

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'});

另外,我不会将变量命名为process,因为它由节点使用:

  

流程对象是一个提供有关和的信息的全局对象   控制当前的Node.js进程。作为一个全球性的,它始终是   不使用require()即可用于Node.js应用程序。

请参阅: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会话 - 如何运行它,测试它是否有效并将其终止:

$ 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
$