Cài đặt Dịch vụ Windows với hành động Khôi phục để Khởi động lại


88

Tôi đang cài đặt Dịch vụ Windows bằng cách sử dụng ServiceProcessInstallerServiceInstallercác lớp.

Tôi đã sử dụng ServiceProcessInstallerđể đặt kiểu bắt đầu, tên, v.v. Nhưng làm cách nào để đặt hành động khôi phục thành Khởi động lại?

Tôi biết tôi có thể làm điều đó theo cách thủ công sau khi dịch vụ được cài đặt bằng cách đi tới bảng điều khiển quản lý Dịch vụ và thay đổi cài đặt trên tab khôi phục thuộc tính của dịch vụ, nhưng có cách nào để thực hiện trong quá trình cài đặt không?

Tab khôi phục thuộc tính dịch vụ

Câu trả lời:


99

Bạn có thể đặt các tùy chọn khôi phục bằng cách sử dụng sc . Thao tác sau sẽ đặt dịch vụ khởi động lại sau khi bị lỗi:

sc failure [servicename] reset= 0 actions= restart/60000

Điều này có thể dễ dàng được gọi từ C #:

static void SetRecoveryOptions(string serviceName)
{
    int exitCode;
    using (var process = new Process())
    {
        var startInfo = process.StartInfo;
        startInfo.FileName = "sc";
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        // tell Windows that the service should restart if it fails
        startInfo.Arguments = string.Format("failure \"{0}\" reset= 0 actions= restart/60000", serviceName);

        process.Start();
        process.WaitForExit();

        exitCode = process.ExitCode;
    }

    if (exitCode != 0)
        throw new InvalidOperationException();
}

4
Lưu ý rằng bạn cần bao gồm tên dịch vụ trong dấu ngoặc kép, nếu nó chứa khoảng trắng.
user626528,

19
Nếu bạn định gọi lệnh này từ trình xử lý cài đặt dịch vụ Installer [] trong C # khi dịch vụ cài đặt, bạn có thể chèn lệnh gọi này vào trình xử lý sự kiện "Đã cam kết" sẽ thực thi nó ngay sau khi dịch vụ xuất hiện trong Trình quản lý kiểm soát dịch vụ. Không đặt nó trong trình quản lý sự kiện "AfterInstall", vì nó sẽ không hoạt động ngay lần đầu tiên dịch vụ được cài đặt trên hộp.
Contango

Phân tích mã của @Kevin Visual Studio gợi ý rằng không nên xử lý các đối tượng nhiều hơn một lần, process.Close()dòng này là vô ích.
JohnTube

1
@ JohnTube - đã xóa dòng process.Close ()
Kevin

23
Lưu ý rằng cú pháp có thể lạ đối với một số người nhưng reset= 0đúng và reset=0không chính xác. Việc sử dụng đúng khoảng trắng là rất quan trọng, reset=là một đối số, sau đó là khoảng trắng 0.
Liam

12

Sau nhiều lần tham dự, tôi đã giải quyết nó bằng ứng dụng dòng lệnh sc .

Tôi có tệp hàng loạt với installutil và sc. Tệp lô của tôi tương tự như:

installutil.exe "path to your service.exe"
sc failure "your service name" reset= 300 command= "some exe file to execute" actions= restart/20000/run/1000/reboot/1000

Nếu bạn muốn có tài liệu đầy đủ về lệnh sc, hãy làm theo liên kết sau: SC.exe: Giao tiếp với Bộ điều khiển dịch vụ và các dịch vụ đã cài đặt

Lưu ý: Bạn cần thêm dấu cách sau mỗi ký hiệu bằng (=). Ví dụ: reset = 300



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.