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

Running a python script in the background using child_process (node js)

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

python test.py &

但是,我如何使用节点 js 中的 child_process 来做同样的事情。

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

我有这段代码,但似乎不起作用。请提出实现这一目标的可能方法。

不要在命令行参数中使用 &(和号)。它被 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'});

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

The process object is a global that provides information about, and control over, the current Node.js process. As a global, it is always available to Node.js applications without using 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 会话 - 如何 运行 它,测试它是否有效并终止它:

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

你真的不应该那样做。流程应该由真正的流程经理处理。

如果您想要 运行 后台进程,您应该了解如何 运行 在 Raspberry Pi 中使用服务。这取决于 Linux 在 Raspberry Pi 上 运行 的发行版(Upstart (like in Debian) or 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}`);
});