Service 如何让锈菌在后台优雅地运行,并将其daemonize?; 这就是我想要实现的目标 我当前的实现逻辑: 后台运行的逻辑 使用std::process::Command; 使用std::线程; 使用std::env; 使用std::time::Duration; fn main(){ 让args:Vec=env::args().collect(); 如果args.len()==2{ 如果&args[1]=“开始”{ //主进程启动子进程 let child=Command::new(&args[0]) .spawn().expect(“子进程启动失败”); println!((“子pid:{}”,child.id()); //主进程出口 } }否则{还有更优雅的方法吗?期待您的回复 //主业务逻辑 运行Web服务器 } }

Service 如何让锈菌在后台优雅地运行,并将其daemonize?; 这就是我想要实现的目标 我当前的实现逻辑: 后台运行的逻辑 使用std::process::Command; 使用std::线程; 使用std::env; 使用std::time::Duration; fn main(){ 让args:Vec=env::args().collect(); 如果args.len()==2{ 如果&args[1]=“开始”{ //主进程启动子进程 let child=Command::new(&args[0]) .spawn().expect(“子进程启动失败”); println!((“子pid:{}”,child.id()); //主进程出口 } }否则{还有更优雅的方法吗?期待您的回复 //主业务逻辑 运行Web服务器 } },service,rust,daemon,Service,Rust,Daemon,这样,rust将在后台运行而不会阻塞终端,但rust在后台打印的信息仍将显示在终端上,退出终端时,当前rust程序将退出 进程守护程序逻辑 我的想法是监视系统的退出信号,而不是处理退出请求 SIGHUP 1 /* Hangup (POSIX). */ SIGINT 2 /* Interrupt (ANSI). */ SIGQUIT 3

这样,rust将在后台运行而不会阻塞终端,但rust在后台打印的信息仍将显示在终端上,退出终端时,当前rust程序将退出

进程守护程序逻辑 我的想法是监视系统的退出信号,而不是处理退出请求

SIGHUP       1          /* Hangup (POSIX).  */                  
SIGINT       2          /* Interrupt (ANSI).  */                       
SIGQUIT      3          /* Quit (POSIX).  */                        
SIGTERM      15         /* Termination (ANSI).  */               
代码:

使用signal_hook:{iterator::Signals,SIGHUP,SIGINT,SIGQUIT,SIGTERM};
使用std::{thread,time::Duration};
pub fn进程_守护进程(){
let signals=match signals::new(&[SIGHUP,SIGINT,SIGQUIT,SIGTERM]){
Ok(t)=>t,
错误(e)=>恐慌!(e),
};还有更优雅的方式吗?期待您的回复
线程::生成(移动| |{
对于sig in signals.forever(){
println!(“接收信号{:?}”,sig);
}
});
线程::睡眠(持续时间::从秒(2));
}

还有更优雅的方法吗?期待您的回复。

TLDR:如果您真的希望您的流程像服务一样运行(并且永不退出),那么您可能需要设置一个服务管理器。否则,就让它成为一个正常的过程

守护进程 需要立即注意的一点是,关于Daemoning的大多数考虑与Rust作为一种语言无关,更多的是关于:

  • 您的流程所针对的基础系统
  • 您的守护进程在生成后的确切行为
  • 通过看你的问题,你似乎已经意识到了其中的大部分。不幸的是,为了正确地回答您的问题,我们必须深入研究复杂的流程以及如何管理这些流程。应该注意的是,如果您对启动基础架构中的平台依赖性感到满意,那么现有的“服务”管理器就是一个很好的解决方案

    • Linux:
    • FreeBSD:
    • 马科斯:
    • 窗口:
    正如您所看到的,如果您想要一个简单的部署能够正常工作(前提是它是为相关系统编译的),那么没有简单的壮举。这些只是简单的服务经理。如果您想支持虚拟环境,您必须考虑Kubernetes服务、dockerizing等

    这些工具的存在是因为在系统上管理长时间运行的流程需要考虑很多因素:

    • 我的守护进程的行为是否应该像服务一样,如果被终止(或者系统重新启动),是否应该重新启动?上述工具将考虑到这一点
    • 如果是服务,我的守护进程是否应该具有与其关联的状态状态以帮助维护?这有助于管理停机和构建工具以横向扩展
    • 如果守护进程不应该是一个服务(在您的情况下,由于二进制文件的名称,这不太可能),那么还有更多的问题:它应该附加到父进程吗?是否应将其附加到登录过程组
    我想对于您的流程,考虑到这可能会变得多么复杂,只需直接运行该流程。一点也不要用daemonize

    对于测试,(如果您处于类似unix的环境中),可以在后台运行您的进程:

    ./webserver start &
    
    这将在后台生成新进程,但会将其附加到shell的进程列表中。这对于测试来说是很好的,因为如果外壳消失,系统将随之清理这些附加的进程

    上述操作将把stderr和stdout文件描述符引导回终端并打印它们。如果您希望避免这种情况,您可以将输出放在其他地方


    对我来说,禁用这样一个进程的信号似乎不是正确的方法。保存这些信号,以便在需要保存状态或向客户端发送终止消息时优雅地退出进程。如果您执行上述操作,您的守护进程将只能通过一个
    kill-9
    或重新启动,或者找到一些未被覆盖的非标准信号来终止。默认行为是终止。

    TLDR:如果您真的希望您的进程像服务一样运行(并且永不退出),可能需要设置服务管理器。否则,就让它成为一个正常的过程

    守护进程 需要立即注意的一点是,关于Daemoning的大多数考虑与Rust作为一种语言无关,更多的是关于:

  • 您的流程所针对的基础系统
  • 您的守护进程在生成后的确切行为
  • 通过看你的问题,你似乎已经意识到了其中的大部分。不幸的是,为了正确地回答您的问题,我们必须深入研究复杂的流程以及如何管理这些流程。应该注意的是,如果您对启动基础架构中的平台依赖性感到满意,那么现有的“服务”管理器就是一个很好的解决方案

    • Linux:
    • FreeBSD:
    • 马科斯:
    • 窗口:
    正如您所看到的,如果您想要一个简单的部署能够正常工作(前提是它是为相关系统编译的),那么没有简单的壮举。这些只是简单的服务经理。如果您想支持虚拟环境,您必须考虑Kubernetes服务、dockerizing等

    这些工具的存在是因为有很多考虑因素
    ./webserver start &