我在树莓派上有一个python脚本 test.py ,需要在后台运行。使用CLI,我这样做:
python test.py &
但是,如何使用节点js中的child_process执行相同的操作。
var spawn = require("child_process").spawn;
var process = spawn("python",["/path/to/test.py", "&"]);
我有这个代码,这似乎无法正常工作。请提供可行的方法来实现这一目标。
答案 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();
到您的计划,其中p
是spawn
返回的内容:
var spawn = require("child_process").spawn;
var p = spawn("python", ["/path/to/test.py"], {detached: true, stdio: 'ignore'});
p.unref();
这是一个示例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
$