Tạo dịch vụ Windows từ tệp thực thi


349

Có cách nào nhanh chóng để cung cấp một tệp thực thi, tạo một dịch vụ Windows mà khi bắt đầu, sẽ khởi chạy nó không?


8
Dưới đây là hướng dẫn của Microsoft về cách đạt được điều này.
PiRX

Câu trả lời:


460

Để tạo Dịch vụ Windows từ tệp thực thi, bạn có thể sử dụng sc.exe:

sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"

Bạn phải có dấu ngoặc kép xung quanh exeđường dẫn thực tế và khoảng trắng sau dấu binPath=.

Thông tin thêm về sclệnh có thể được tìm thấy trong Microsoft KB251192 .

Lưu ý rằng nó sẽ không hoạt động đối với bất kỳ thực thi nào: tệp thực thi phải là một Dịch vụ Windows ( nghĩa là triển khai ServiceMain ). Khi đăng ký dịch vụ không thực thi như một dịch vụ, bạn sẽ gặp phải lỗi sau khi thử khởi động dịch vụ:

Lỗi 1053: Dịch vụ không đáp ứng yêu cầu bắt đầu hoặc kiểm soát một cách kịp thời.

Có những công cụ có thể tạo một Dịch vụ Windows từ các tệp thực thi tùy ý, không phải dịch vụ, xem các câu trả lời khác để biết ví dụ về các công cụ đó.


11
bạn sẽ (gần như chắc chắn) phải chạy dấu nhắc lệnh với tư cách Quản trị viên để lệnh này hoạt động
Jeutnarg

2
Đường dẫn cũng cần phải là đường dẫn đủ điều kiện - Tôi không thể bắt đầu dịch vụ của mình bằng cách sử dụng đường dẫn tương đối.
RunOfTheShipe

4
không gian sau binpath=cùng với việc phải bao quanh đường dẫn thực thi với dấu ngoặc kép là hoàn toàn sai, ít nhất là đối với windows 10. trích dẫn là bắt buộc khi và chỉ khi đường dẫn chứa các ký tự đặc biệt như khoảng trắng. Ngoài ra, vỏ (lowe / Upper / hỗn hợp) không quan trọng ở bất cứ đâu, trong các tên biến cũng displayname="my service"là một tính năng khác để truyền dòng lệnh trong khi tạo một dịch vụ để xem như hàng đầu tiên ( Name) tại services.msc.

2
Không gian sau binPath=được yêu cầu cho tôi trên Windows 7 nhưng không phải trên Windows 10
datchung

242

Sử dụng NSSM ( Trình quản lý dịch vụ không hút ) để chạy tệp .BAT hoặc bất kỳ tệp .EXE nào dưới dạng dịch vụ.

http://nssm.cc/

  • Bước 1 : Tải xuống NSSM
  • Bước 2 : Cài đặt dịch vụ của bạn vớinssm.exe install [serviceName]
  • Bước 3 : Điều này sẽ mở một GUI mà bạn sẽ sử dụng để xác định vị trí thực thi của mình

6
Quản lý dịch vụ tốt nhất bao giờ hết. Tôi thậm chí đã quản lý để có được PlexWatch để cài đặt như một dịch vụ sử dụng NSSM.
Bắt buộc

2
bộ này là một dịch vụ mãi mãi? mọi lúc cửa sổ bắt đầu dịch vụ sẽ bắt đầu? Ngoài ra, làm thế nào tôi có thể làm điều này mà không cần tương tác người dùng? một kịch bản hoặc mã của một số loại?
John Demetriou

9
Điều này là hoàn toàn tuyệt vời, tôi ước tôi có thể chấp nhận câu trả lời này thay vì câu trả lời đầu tiên, :-(
Latorre của Đức

2
Tôi có thể chạy Dropbox như một dịch vụ trên máy chủ. Hoàn toàn là một công cụ không mút!
Barry Guvenkaya

1
Do tệp exe phải là một dự án dịch vụ windows, để có thể hoạt động với nssm hoặc nó có thể là một tệp exe bình thường?, Bởi vì khi tôi sử dụng nssm start [tên dịch vụ] nó hiển thị lỗi như, dịch vụ windows không thể chạy từ nhắc lệnh vv
Sanjeev

92

Mở rộng câu trả lời (Kevin Tong).

Bước 1: Tải xuống & Giải nén nssm-2.24.zip

Bước 2: Từ loại dòng lệnh:

C:\> nssm.exe install [servicename]

nó sẽ mở GUI như bên dưới (ví dụ là máy chủ UT2003), sau đó chỉ cần duyệt nó tới: yourapplication.exe

nhập mô tả hình ảnh ở đây

Thêm thông tin về: https://nssm.cc/usage


4
Cú pháp đúng nssm.exe install [serviceName]. Giải pháp này hoạt động nhưng nếu bạn có Ứng dụng GUI, nó sẽ không hoạt động trên Win Serever2003. Nếu sau này bạn muốn xóa nó, hãy sử dụngnssm.exe remove [youservicename]
Hammad Khan

1
Tôi giả sử tham chiếu đến nginx là vì đó là chương trình cụ thể mà bạn muốn chạy như một dịch vụ? Cho đến khi tôi thấy bình luận của hmd ở trên, tôi nghĩ rằng bạn đang cố gắng giúp đỡ bằng cách ngụ ý rằng nginx là một phụ thuộc bắt buộc để cài đặt hoặc một cái gì đó ... nhưng trong GUI có vẻ như bạn không cài đặt nginx, bạn đang cài đặt Giải đấu không thật người phục vụ? Chỉ cần chỉ ra rằng ví dụ này không nhất quán và có khả năng gây hiểu lầm. Một "Đơn giản giả sử bạn muốn cài đặt nginx như một dịch vụ, thì nó sẽ trông như thế này:" sẽ giúp ích.
flutefreak7

@ flutefreak7 có nginxkhông cần thiết và gây hiểu nhầm. Lệnh sẽ làm việc mà không có nó là tốt. Đây là tham số tùy chọn nếu bạn muốn cung cấp tên dịch vụ từ dấu nhắc lệnh.
Hammad Khan

1
Khi tôi cố gắng sử dụng nssm, Windows Forms của tôi đang chạy nhưng biểu mẫu không được hiển thị ... Tại sao?
Radenko Zec

Nó chạy ứng dụng của bạn dưới dạng dịch vụ Windows, hầu hết chúng dành cho phụ trợ. Nó cũng có thể là nó chạy như một tên người dùng root / admin khác. bạn phải kiểm tra nó Cũng biết thêm thông tin bạn có thể kiểm tra ở đây: nssm.cc/usage

16

Nhiều câu trả lời hiện có bao gồm sự can thiệp của con người tại thời điểm cài đặt. Đây có thể là một quá trình dễ bị lỗi. Nếu bạn có nhiều tệp thực thi muốn được cài đặt dưới dạng dịch vụ, điều cuối cùng bạn muốn làm là thực hiện chúng theo cách thủ công khi cài đặt.

Hướng tới kịch bản được mô tả ở trên, tôi đã tạo serman , một công cụ dòng lệnh để cài đặt một tệp thực thi như một dịch vụ. Tất cả những gì bạn cần viết (và chỉ viết một lần) là một tệp cấu hình dịch vụ đơn giản cùng với tệp thực thi của bạn. Chạy

serman install <path_to_config_file>

sẽ cài đặt dịch vụ. stdoutstderrtất cả đều được ghi lại. Để biết thêm thông tin, hãy xem trang web của dự án .

Một tập tin cấu hình làm việc rất đơn giản, như thể hiện dưới đây. Nhưng nó cũng có nhiều tính năng hữu ích như <env><persistent_env>bên dưới.

<service>
  <id>hello</id>
  <name>hello</name>
  <description>This service runs the hello application</description>

  <executable>node.exe</executable>

  <!-- 
       {{dir}} will be expanded to the containing directory of your 
       config file, which is normally where your executable locates 
   -->
  <arguments>"{{dir}}\hello.js"</arguments>

  <logmode>rotate</logmode>

  <!-- OPTIONAL FEATURE:
       NODE_ENV=production will be an environment variable 
       available to your application, but not visible outside 
       of your application
   -->
  <env name="NODE_ENV" value="production"/>

  <!-- OPTIONAL FEATURE:
       FOO_SERVICE_PORT=8989 will be persisted as an environment
       variable to the system.
   -->
  <persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>

9

các tính năng bổ sung này tỏ ra hữu ích .. cần được thực thi với tư cách quản trị viên

sc create  <service_name> binpath=<binary_path>
sc stop    <service_name>
sc queryex <service_name>
sc delete  <service_name>

Nếu tên dịch vụ của bạn có bất kỳ khoảng trắng nào, hãy đặt trong "dấu ngoặc kép".


Không có lệnh INSTALL cũng như trong My Win 2003 sc.exe 5.2.3790.3959 của tôi, cũng như trong M $ F1
user6698332

1
Sử dụng "tạo" thay vì "cài đặt". sc create <service_name> binpath= <binary_path>
CSquared

4

Tôi đã thử nghiệm một sản phẩm tốt cho điều đó: Luôn cập nhật . Không miễn phí nhưng họ có thời gian dùng thử 30 ngày để bạn có thể dùng thử ...


0

Bạn có thể kiểm tra tiện ích miễn phí nhỏ của tôi cho dịch vụ tạo \ edit \ xóa hoạt động. Dưới đây là ví dụ tạo:

Chuyển đến Dịch vụ -> Sửa đổi -> Tạo

nhập mô tả hình ảnh ở đây

Tệp thực thi (ổ google): [Tải xuống]

Mã nguồn: [Tải xuống]

Bài đăng trên blog: [BlogLink]

Lớp biên tập dịch vụ: WinServiceUtils.cs

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.