我不是Linux专家,很抱歉,如果我的术语不是100%正确的话。我有一个运行Debian的嵌入式设备。设备运行Node.js网络服务器。此Node.js应用程序与Node可执行文件捆绑在一起,并打包为 .deb文件。该包通过包含init.d脚本来定义服务(守护进程?)。因此,为了更新应用程序,我只需输入" dpkg -i my-service.deb"。 Node.js应用程序可以上传debian软件包( .deb)并将它们存储在临时文件夹中。
问题:如何从节点应用程序本身更新服务(节点可执行文件+节点应用程序)?
...如果我调用child_process.exec(" dpkg -i new-version-of-my-service.deb")它首先停止服务,然后没有任何反应。
答案 0 :(得分:0)
以下是问题的解决方法:
function update_self(deb_package_filename) {
var fileToInstall = path.join(upload_dir, deb_package_filename);
var out = fs.openSync(path.join(upload_dir, 'out.log'), 'a');
var err = fs.openSync(path.join(upload_dir, 'out.log'), 'a');
var child = spawn("dpkg", ["-i", fileToInstall], {
cwd: upload_dir, // working directory
detached: true, // detach from the parent process group
stdio: [ 'ignore', out, err ]
});
child.unref();
}
子进程与调用者分离,因此即使父进程被终止,dpkg进程仍会运行。