RUST 如何在后台运行? 不使用nohup

发布于 2022-09-12 02:32:31 字数 1500 浏览 30 评论 0

您好 我尝试在我 树莓派上运行RUST 不知道如何使它在后台运行

注意: 该环境没有nohup 也无法安装它

我的尝试是监听系统的信号而不去让我退出的信号

use std::thread;
use signal_hook::{iterator::Signals, SIGINT};
fn main() {
    let signals = Signals::new(&[SIGINT]).unwrap();

    let a = thread::spawn(move || {
        for sig in signals.forever() {
            println!("Received signal {:?}", sig);
        }
    });

    // 处理逻辑 此处省略 ...
    a.join().unwrap();
}

but 貌似还是不行 您有更好的解决方法吗?期待您的回复


最终的修改

use std::process::Command;
use std::thread;
use std::env;
use std::time::Duration;

fn main() {
    let args: Vec<String> = env::args().collect();
    if args.len() == 2 {
        if &args[1] == "start" {
            // 主进程启动 子进程
            let child = Command::new(&args[0])
                .spawn().expect("Child process failed to start.");
            println!("child pid: {}", child.id());
            // 主进程退出
            // child.forget() No Child Left Behind
        }
    } else {
        // 这里为业务逻辑....
        let mut i = 1;
        loop {
            i += 1;
            println!("i: {}",i);
            thread::sleep(Duration::from_millis(500));
        }
    }
}

按照这个逻辑可以使 改程序在后台运行 BUT 关闭当前窗口 会退出 (可以通过监听信号来解决这个问题)

一个非常神奇的就是 在后台运行println!() 这打印的内容会在前台显示

参考: https://github.com/rust-lang/...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甲如呢乙后呢 2022-09-19 02:32:31

更新:
要使进程变为守护进程的主要步骤为:

  1. 创建一个普通进程(父进程)
  2. 通过父进程fork一个子进程
  3. 终止父进程
  4. 子进程变为孤立进程

参考:

  1. https://stackoverflow.com/que...
  2. https://github.com/rust-lang/...

  1. 如果你有nodejs环境的话可以用pm2
  2. 可以把这个程序变成service服务,用systemctl管理

参考:https://medium.com/@benmorel/...

背叛残局 2022-09-19 02:32:31

我写一个一个小程序 https://github.com/dollarkill...
经过测试 只要监听这些信号

SIGHUP       1          /* Hangup (POSIX).  */                          终止进程     终端线路挂断
SIGINT       2          /* Interrupt (ANSI).  */                        终止进程     中断进程 Ctrl+C
SIGQUIT      3          /* Quit (POSIX).  */                            建立CORE文件终止进程,并且生成core文件 Ctrl+\
SIGTERM      15         /* Termination (ANSI).  */                      终止进程     软件终止信号

就能在终端关闭后不被关闭

但是不够优雅 我希望该程序一启动就在后台运行

root> ./xxx  // 在后台运行  不会阻塞终端
root> 

请问在RUST中有什么优雅的解决方法吗?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文