Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
365 views
in Technique[技术] by (71.8m points)

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/...


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

  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/...


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...