在后台使用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议可能的方法来实现这一点。
不要在命令行参数中使用&
(&符号)。 它由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();
到你的程序中,其中p
是spawn
返回的内容:
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}`); });