process - 如何在 Rust 中生成分离的命令/进程?
问题描述
我编写了一个小的可执行文件来为 Node 开发环境启动一个 WebSocket 服务器。
在一个单独的 NodeJS 应用程序(在 Electron 中运行)中,我child_process.spawn()
用来运行二进制文件并在应用程序启动时启动服务器。
该服务器子进程劫持了节点child_process
生成的命令并且不退出,因此我无法捕获退出代码或处理故障。我只需要知道它开始或没有开始。
如何在 Rust 中启动这个过程,以便我可以退出(成功、失败等)并且孩子继续运行?
我的相关部分main.rs
:
extern crate ws;
use std::env;
use std::process::Command;
use ws::{connect, CloseCode};
fn main() {
let args: Vec<String> = env::args().collect();
let command = &args[1];
if command == "activate" {
println!("Activating");
stop_server_process();
start_server_process();
}
}
fn start_server_process() {
let mut command;
if cfg!(windows) {
command = Command::new(".\\node_modules\\.bin\\ws.cmd");
} else {
command = Command::new("./node_modules/.bin/ws");
}
command.arg("--websocket");
command.arg("test/mock-api/ws-server.js");
command.arg("-p");
command.arg("9401");
match command.spawn() {
Ok(child) => println!("Server process id is {}", child.id()),
Err(e) => {
println!("Server didn't start: {}", e);
std::process::exit(1);
},
}
std::process::exit(0);
}
fn stop_server_process() {
connect("ws://localhost:9401", |out| {
out.send("server-stop").unwrap();
move |msg| {
println!("Got message: {}", msg);
out.close(CloseCode::Normal)
}
}).unwrap()
}
我正在从我的 Electron 应用程序运行二进制文件,如下所示:
/**
* @return {Promise<Boolean>}
*/
static activate() {
return new Promise((resolve, reject) => {
const command = spawn(process.env.SERVER_LOCAL_PATH, ['activate']);
command.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
command.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
command.on('close', code => resolve(code === 0));
command.on('error', error => reject(error));
});
}
这永远不会解决,因为ws
websocket 开始运行并且生成的进程现在正在从中获取事件。我的控制台输出如下:
stdout: Activating <--- Rust binary output
Server process id is 78057 <--- Rust binary output
stderr: Serving at [various URL variations] <--- ws binary output
stdout: Client Connected <--- ws binary output
WebSocket 服务器基于此库中的示例和代码。这是它的可复制版本:
module.exports = SocketBase => class Socket extends SocketBase {
websocket(wss) {
wss.on('connection', (ws) => {
console.log('Client Connected');
ws.on('message', (data) => {
if (data === 'server-stop') {
console.log('Stopping...');
process.exit(0);
}
// do some faked JSON response data
});
ws.on('close', () => {
console.log('Client Disconnected');
});
ws.on('error', (error) => {
console.log(error.toString());
});
});
}
};
解决方案
推荐阅读
- django-mptt - 如何计算 MPTT 模型中后代的顺序或位置?
- ios - Swift/SwiftUI 加载多个核心数据对象并在视图中显示
- opencv - 如何在 Julia 中的图像上绘制感兴趣区域?
- ag-grid - 切换 Ag-Grid 图表的行/列
- r - R中具有虚拟(因)变量和分类(独立)变量的线性回归模型
- java - 观察后如何在弹簧靴中重置仪表指标
- django - 我实际上是在命令提示符下配置 django .....安装了 pip、python 和 django 但是每当我运行 manage.py 时都会引发导入错误?
- javascript - 如何在 javascript 中使用 getImageData()?
- struct - 球拍:如何在结构列表中的结构字段上应用过滤器
- android - 新生成的 Capacitor Plugin Java 导入错误