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?
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?
Câu trả lời:
Để 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ề sc
lệ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ụ đó.
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
.
binPath=
được yêu cầu cho tôi trên Windows 7 nhưng không phải trên Windows 10
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ụ.
nssm.exe install [serviceName]
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
Thêm thông tin về: https://nssm.cc/usage
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]
nginx
khô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.
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ụ. stdout
và stderr
tấ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>
và <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>
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".
sc create <service_name> binpath= <binary_path>
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ử ...
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
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