我在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", "&"]);
我有这段代码,这似乎不起作用。请提出实现这一目标的可能方法。
发布于 2016-06-30 07:47:09
不要在命令行参数中使用&
(符号)。它由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
,因为它是由节点使用的:
process对象是一个全局对象,它提供有关当前Node.js进程的信息并对其进行控制。作为一个全局工具,Node.js应用程序总是可以使用它,而不需要使用require()。
请参阅:流程
更新
如果它仍然没有退出,尝试添加:
p.unref();
到您的程序,其中p
是spawn
返回的
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
$
发布于 2016-06-30 07:49:16
你不应该这么做的。流程应该由真正的流程管理器来处理。
如果要运行后台进程,应该研究如何在Raspberry Pi中运行服务。这取决于运行在Raspberry Pi (新贵 (类似于Debian)或系统d (如CentOS))上的Linux发行版。
但是无论如何,引用文档的一个例子
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}`);
});
https://stackoverflow.com/questions/38127766
复制相似问题