返回

rust-当watcher出现故障时,我如何重新启动它?

发布时间:2022-05-01 19:36:28 281
# scala

我使用rust编写程序通知目录的每个人

1.启动一个观察者2。loop击中箱子,然后做某事。

因为我使用了Ok(DebouncedEvent::Create(p)),所以我首先删除目录(正在监视),然后创建它,但监视程序无法继续监视

所以我认为fs可能不是原子性的,所以我睡了3秒钟,但它又失败了

然后我尝试删除文件,但没有删除目录,但再次失败

启动一个观察者

    // Create a channel to receive the events.
    let (tx, rx) = channel();
    // Create a watcher
    let mut watcher: RecommendedWatcher = try!(Watcher::new(tx.clone(), Duration::from_secs(policy_interval as u64)));
    // Path to be monitored
    try!(watcher.watch(metrics_repo_path.as_path(), RecursiveMode::Recursive));

我的循环

            loop
            { // Step 2: Start monitoring metrics repository
                match rx.recv()
                {
                    Ok(DebouncedEvent::Create(p)) =>
                    {
                        eprintln!("OK OK, loop start");
                        if let Some(ext) = p.extension()
                        {
                                if num_log_files == num_instances
                                { // We have all logs for this epoch
 

                                        remove_dir_contents(metrics_repo_path.to_str()).unwrap();
                                        thread::sleep(Duration::from_millis(3000));
                                        // // Remove old rates files
                                        // // TODO: remove only files in the repo
                                        // let _ = Command::new("rm")
                                        //             .arg("-r")
                                        //             .arg(metrics_repo_path.to_str().unwrap())
                                        //             .output()
                                        //             .expect("Failed to remove log files.");
                                        // // Create a new rates folder
                                        // let _ = Command::new("mkdir")
                                        //             .arg(metrics_repo_path.to_str().unwrap())
                                        //             .output()
                                        //             .expect("Failed to create new rates folder.");
                                    }
                                    else
                                    { // No re-configuration was issued
                                        epochs_since_reconfiguration += 1;
                                    }
                                    // Clear epoch information
                                    epoch_files.remove(epoch);
                                }
                            }
                        }
                    },
                    Err(e) => panic!("Monitoring error: {:?}", e),
                    _ => {}
                }
            }

fn

fn remove_dir_contents>(path: P) -> io::Result<()> {
    for entry in fs::read_dir(path)? {
        fs::remove_file(entry?.path())?;
    }
    Ok(())
}

我也尝试重新启动watcher,但是失败了

    remove_dir_contents(metrics_repo_path.to_str()).unwrap();
    thread::sleep(Duration::from_millis(3000));
    try!(watcher.watch(metrics_repo_path.as_path(), RecursiveMode::Recursive));

非常感谢您的帮助。

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像