与需要在后台跟踪某些内部状态的 Rust 库交互的最方便的方式是什么。
例如我有以下程序:
use tokio::io::AsyncBufReadExt;
#[tokio::main]
async fn main() {
let mut state = 0;
let mut reader = tokio::io::BufReader::new(tokio::io::stdin());
loop {
let mut buffer = Vec::new();
reader.read_until(b'\n', &mut buffer).await.unwrap();
let cmd = std::str::from_utf8(&buffer).unwrap();
match cmd {
"get-count\n" => {
println!("{}", state);
state += 1;
}
_ => {
}
}
}
}
我可以使用 Linux bash 通过以下方式与之交互:
cargo run
get-count
0
get-count
1
another-command
get-count
2
但是,这会创建一个阻塞进程,并且在与库交互时我需要使用其他 bash 命令的输入。
我的目标是将其作为守护进程运行,以便我可以使用 bash 按以下方式与其交互:
>> ./start-service
>> ./service-cli get-count
0
>> ./service-cli get-count
1
>> COUNT=$(./service-cli get-count)
>> echo $COUNT
2
使用 Linux 时最佳实践是什么?有没有关于如何使用 systemd 执行类似操作的示例?
您可以使用
coproc
来执行所需的命令,命令的标准输出和标准输入通过管道文件描述符连接。
coproc cargo run
然后
echo get-count >&"${COPROC[0]}"
和
read -u "${COPROC[0]}" count
echo "$count"