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

您好 我尝试在我 树莓派上运行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/...

阅读 7.4k
2 个回答

我写一个一个小程序 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中有什么优雅的解决方法吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏