Linux bash 中的守护进程

问题描述 投票:0回答:1

与需要在后台跟踪某些内部状态的 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 执行类似操作的示例?

linux daemon systemd
1个回答
0
投票

您可以使用

coproc
来执行所需的命令,命令的标准输出和标准输入通过管道文件描述符连接。

coproc cargo run

然后

echo get-count  >&"${COPROC[0]}"

read -u "${COPROC[0]}" count
echo "$count"
© www.soinside.com 2019 - 2024. All rights reserved.