Vấn đề gặp phải
Trong dự án phát triển trợ lý AI, nhóm chúng tôi tích hợp chức năng tìm kiếm file thông qua Everything.exe và es.exe. Tuy nhiên, sau khi phát hành bản dùng thử, nhiều người dùng báo rằng sau khi sử dụng chức năng tìm kiếm của ứng dụng, phần mềm Everything đã cài đặt sẵn trên máy không còn khởi động được. Cụ thể, khi nhấp vào biểu tượng Everything trên desktop, cửa sổ tìm kiếm không hiển thị.
Phân tích nguyên nhân
Theo tài liệu chính thức từ voidtools, Everything mặc định chỉ cho phép chạy một phiên bản duy nhất. Khi khởi động Everything.exe, chương trình sẽ kiểm tra xem có tiến trình nào đang hoạt động hay không:
- Nếu có: Các tham số dòng lệnh sẽ được chuyển tới phiên bản hiện tại để xử lý.
- Nếu không: Một phiên bản mới sẽ được tạo.
Do đó, việc ứng dụng AI khởi động Everything.exe mà không chỉ định instance đã chiếm giữ phiên bản mặc định, dẫn đến xung đột khi người dùng cố gắng mở Everything từ desktop.
Giải pháp: Sử dụng instance có tên (named instance)
Everything hỗ trợ chạy đa nhiệm nếu sử dụng instance có tên riêng biệt. Mỗi instance tên sẽ:
- Có cấu hình riêng (lưu trong file
Everything-[TÊN_INSTANCE].ini). - Chạy độc lập với các instance khác.
- Hiển thị tên trên tiêu đề cửa sổ và tooltip icon hệ thống.
1. Khởi động Everything với instance tên riêng
Thay vì gọi Everything.exe trực tiếp, cần truyền tham số -instance để phân tách môi trường:
Everything.exe -instance "WUTY"
Cập nhật mã khởi động trong ứng dụng:
/// <summary>
/// Khởi động dịch vụ Everything dưới dạng instance riêng
/// </summary>
public async Task StartEverythingAsync()
{
const string processName = "Everything";
var processes = Process.GetProcessesByName(processName);
if (processes.Length >= 2) return;
var baseDir = AppDomain.CurrentDomain.BaseDirectory;
_logger.Info($"Khởi chạy {processName}, đường dẫn: {baseDir}");
var args = "-instance \"WUTY\"";
StartProcess(processName, baseDir, args);
await Task.Delay(100);
}
2. Đăng ký dịch vụ hệ thống cho instance tên
Để tránh cảnh báo UAC khi khởi động, cần cài đặt dịch vụ nền cho instance tên bằng script thực thi ở chế độ admin:
cd /d %~dp0
Everything.exe -instance "WUTY" -uninstall-service
Everything.exe -instance "WUTY" -install-service
sc failure Everything reset= 30 actions= restart/5000 >> InstallLog.txt
exit
Script này gỡ cài đặt cũ (nếu có), cài mới dịch vụ và cấu hình tự động khởi động lại sau lỗi.
3. Truy vấn file bằng es.exe với cùng instance
Khi tìm kiếm, công cụ dòng lệnh es.exe cũng phải trỏ đúng instance đã khởi động:
/// <summary>
/// Tìm kiếm file theo nội dung
/// </summary>
private async Task<string> SearchFileAsync(string content)
{
await StartEverythingAsync();
var command = $"es.exe -instance \"WUTY\" \"{content}\"";
var basePath = AppDomain.CurrentDomain.BaseDirectory;
_logger.Info($"Thực thi lệnh: {command}, tại: {basePath}");
return await RunCmdAsync(command, basePath);
}
Kết luận
Bằng cách sử dụng cơ chế -instance, ứng dụng AI có thể vận hành Everything độc lập mà không ảnh hưởng đến phiên bản người dùng cài đặt. Đồng thời, việc đồng bộ instance giữa Everything.exe và es.exe đảm bảo tính toàn vẹn dữ liệu và hiệu năng tìm kiếm.