找回密码
 立即注册
首页 业界区 安全 Everything 支持 多实例 运行

Everything 支持 多实例 运行

炳裘垦 前天 16:48
出现的问题

我们项目组做了一个AI助手,调用了everything.exe 和 es.exe 实现了文件搜索的功能。但是在发布灰度使用的,好多用户反馈只要用了AI助手的文件搜索后,本机安装的everything的程序就调用不出来了。具体的现象如下图,点击桌面的Everything就不会显示弹出搜索界面了
 
1.png

 
排查问题

查阅了Everything官方网站,是支持多实例运行的:Multiple Instances - voidtools
Everything 默认只能运行一个实例。
当运行 Everything.exe 时,它会检测已存在的实例。如果发现已存在实例,那么命令行选项将会发送并由已存在实例执行。如果未发现已存在实例,则创建一个新实例。
以多实例运行 Everything,使用命名实例。
命名实例

Everything 默认使用未命名实例。
指定一个唯一的名称给 Everything 实例以使用多实例。
每个实例只能有一个单独的实例名称。
指定名称给实例:
启动 Everything.exe 时,使用 -instance 命令行选项以指定实例名称。
例如:
  1. Everything.exe -instance "ETP Server"
复制代码
命名实例使用单独的设置和数据。
例如:命名实例 "ETP Server" 将使用 Everything-ETP SERVER.ini 作为设置文件。
实例名称位于 Everything 搜索窗口标题栏和鼠标悬浮于托盘图标时工具提示。
服务

Everything 默认为每个实例安装一个服务。
 
为所有实例使用相同服务,使用 -service-pipe-name 命令行选项或 service_pipe_name ini 选项以指定相同服务管道名。
默认未命名管道名为:
  1. \\\\.\\PIPE\\Everything Service
复制代码
例如:用补个不同的实例名连接默认服务管道:
  1. Everything.exe -instance "ETP Server" -service-pipe-name "\\\\.\\PIPE\\Everything Service"
复制代码
检查代码,虽然我们在程序内部内置了Everything.exe 和 es.exe,用于防止用户没有安装Everything的情况,但是我们程序启动,都是直接启动的Everything.exe,也就是默认的默认的实例。这样的启动方式,会触发只能运行单一的默认一个实例。
而我们点击桌面的Everything.exe,也是运行默认的实例,所以会出现启动不了桌面点击的Everything应用
  1.      /// <summary>
  2.      /// 启动Everything
  3.      /// </summary>
  4.      public async Task StartEverythingAsync()
  5.      {
  6.          string processName = "Everything";
  7.          Process[] processes = Process.GetProcessesByName(processName);
  8.          if (processes.Length >= 2) return;
  9.          var currentDomainBaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
  10.          _logger.Info($"调用{processName} ,路径:{currentDomainBaseDirectory}");
  11.          StartProcess(processName, currentDomainBaseDirectory);
  12.          await Task.Delay(100);
  13.      }
复制代码
 
解决方案:

1、Ai助手启动Everything,通过指定 instance 名称的方式启动。
  1.   /// <summary>
  2.   /// 启动Everything
  3.   /// </summary>
  4.   public async Task StartEverythingAsync()
  5.   {
  6.       string processName = "Everything";
  7.       Process[] processes = Process.GetProcessesByName(processName);
  8.       if (processes.Length >= 2) return;
  9.       var currentDomainBaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
  10.       _logger.Info($"调用{processName} ,空间路径:{currentDomainBaseDirectory}");
  11.       var args = "-instance "WUTY"";
  12.       StartProcess(processName, currentDomainBaseDirectory, args);
  13.       await Task.Delay(100);
  14.   }
复制代码
2、配套的es查询也需要指定 instance  查询
  1.   /// <summary>
  2.   /// 搜索文件
  3.   /// <returns>返回路径</returns>
  4.   /// </summary>
  5.   private async Task<string> SearchFileAsync(string content)
  6.   {
  7.       await StartEverythingAsync();
  8.       string cmd = $"es.exe -instance "WUTY" {content}";
  9.       var currentDomainBaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
  10.       _logger.Info($"调用{cmd} ,路径:{currentDomainBaseDirectory}");
  11.       return await RunCmdAsync(cmd, currentDomainBaseDirectory);
  12.   }
复制代码
 效果如下图:
2.jpeg

 

来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册