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服务器 } }
这样,rust将在后台运行而不会阻塞终端,但rust在后台打印的信息仍将显示在终端上,退出终端时,当前rust程序将退出 进程守护程序逻辑 我的想法是监视系统的退出信号,而不是处理退出请求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
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:
- 马科斯:
- 窗口:
- 我的守护进程的行为是否应该像服务一样,如果被终止(或者系统重新启动),是否应该重新启动?上述工具将考虑到这一点
- 如果是服务,我的守护进程是否应该具有与其关联的状态状态以帮助维护?这有助于管理停机和构建工具以横向扩展
- 如果守护进程不应该是一个服务(在您的情况下,由于二进制文件的名称,这不太可能),那么还有更多的问题:它应该附加到父进程吗?是否应将其附加到登录过程组
./webserver start &
这将在后台生成新进程,但会将其附加到shell的进程列表中。这对于测试来说是很好的,因为如果外壳消失,系统将随之清理这些附加的进程
上述操作将把stderr和stdout文件描述符引导回终端并打印它们。如果您希望避免这种情况,您可以将输出放在其他地方
对我来说,禁用这样一个进程的信号似乎不是正确的方法。保存这些信号,以便在需要保存状态或向客户端发送终止消息时优雅地退出进程。如果您执行上述操作,您的守护进程将只能通过一个
kill-9
或重新启动,或者找到一些未被覆盖的非标准信号来终止。默认行为是终止。TLDR:如果您真的希望您的进程像服务一样运行(并且永不退出),可能需要设置服务管理器。否则,就让它成为一个正常的过程
守护进程
需要立即注意的一点是,关于Daemoning的大多数考虑与Rust作为一种语言无关,更多的是关于:
- Linux:
- FreeBSD:
- 马科斯:
- 窗口:
./webserver start &