Tôi có một ứng dụng máy chủ mà tôi muốn chạy bất cứ khi nào máy tính đang chạy và thường thì đây là trường hợp, ngoại trừ đôi khi tôi sẽ thấy nó tự đóng.
Có một con dơi hay tập lệnh nào tôi có thể chạy để theo dõi ứng dụng và khởi động lại nó không?
Tôi có một ứng dụng máy chủ mà tôi muốn chạy bất cứ khi nào máy tính đang chạy và thường thì đây là trường hợp, ngoại trừ đôi khi tôi sẽ thấy nó tự đóng.
Có một con dơi hay tập lệnh nào tôi có thể chạy để theo dõi ứng dụng và khởi động lại nó không?
Câu trả lời:
Điều này không phải lúc nào cũng hoạt động (nó phụ thuộc vào cách chương trình tự tải), nhưng thông thường bạn có thể tạo một tệp bó như thế này:
@Echo off
:Start
NotePad
echo Program terminated at %Date% %Time% with Error %ErrorLevel% >> c:\logs\program.log
echo Press Ctrl-C if you don't want to restart automatically
ping -n 10 localhost
goto Start
Tôi đã sử dụng Notepad làm ví dụ.
Những dòng kẻ
echo Press Ctrl-C if you don't want to restart automatically
ping -n 10 localhost
chỉ là một sự chậm trễ (10 giây) để cung cấp cho người dùng cơ hội hủy bỏ quá trình trước khi nó bắt đầu lại.
Dòng
echo Program terminated at %Date% %Time% with Error %ErrorLevel% >> c:\logs\program.log
là không cần thiết, nhưng sẽ đăng nhập mỗi khi chương trình được đóng vào một tệp, vì vậy có thể hữu ích để chẩn đoán sự cố ErrorLevel có thể không cho bạn biết nhiều, nhưng một chương trình được cho là trả về 0 nếu nó đóng bình thường và không -zero tin nhắn nếu nó không
Lưu ý, Bạn đề cập rằng chương trình của bạn không làm gì nếu đã chạy. Điều đó thường có nghĩa là ứng dụng khởi động, phát hiện một bản sao khác đang chạy và tắt ngay lập tức. Nếu đó là trường hợp và chương trình của bạn đang chạy trước khi bạn bắt đầu tệp bó này, thì lô sẽ lặp vòng và cố gắng khởi động chương trình của bạn cứ sau mười giây.
Dựa trên các câu trả lời của bạn ở trên, điều tôi đề nghị là bạn đặt lệnh đó vào một tệp bó, sau đó đặt tệp bó đó để chạy như một tác vụ theo lịch trình mỗi phút. Hầu như không có chi phí liên quan đến việc này và nó đảm bảo rằng quy trình của bạn được nêu rõ bất kể bạn có ở quanh để nhận ra rằng nó đã dừng lại hay không.
Tôi đoán câu trả lời đúng cho câu hỏi này phụ thuộc vào lý do tại sao bạn muốn làm điều đó. Bạn đang cố gắng giải quyết tắt máy vô tình? Ngăn chặn tình cờ tắt "độc hại" bởi người dùng máy (ví dụ: nhân viên đóng phần mềm giám sát)? Ngăn chặn cuộc tấn công độc hại nghiêm trọng và lành nghề? Bạn đang cố gắng tự viết phần mềm độc hại (trong trường hợp nào xin vui lòng tắt ;-))?
Ngoài ra, như các nhà bình luận khác đã đề cập, sẽ khác nếu bạn viết một dịch vụ Windows (ví dụ)
Cá nhân, tôi có thể bắt đầu bằng cách viết một ứng dụng thứ hai và bắt đầu nó theo cùng một cách. Có cả hai ứng dụng quét cho nhau theo định kỳ và khởi động lại nếu cần - đảm bảo rằng bạn cung cấp một cách dễ dàng để ứng dụng được đóng hợp pháp mặc dù!
Điều đó nói và đưa ra nhận xét của bạn "đôi khi tôi sẽ thấy nó tự đóng lại" Tôi sẽ THỰC SỰ bắt đầu bằng cách cố gắng tìm hiểu tại sao nó đóng cửa ...
Bạn có thể sử dụng một chương trình có tên ReStartMe 2.0 [ Mirror ] thực hiện chính xác điều đó:
Màn hình cho các quy trình và khởi động lại chúng nếu chúng đóng.
đây là cách tốt hơn đây là một số mã tôi đã sử dụng cho một máy chủ trò chơi nhỏ nhất nên được lưu trên tệp .bat
@echo off
rem This is a comment line
rem This one is a comment too
rem Following line ensures the working directory is searched in C:
C:
rem Join the correct directory, where the server stuff lies in:
cd "C:\Users\morenavaj\Documents\minetest-0.4.16-win64 - Lone_Wolf\"
:love_spaghetti_code
bin\server.lnk --config minetest.conf ^
--worldname "Land of Blockheads" ^
--gameid minetest_game ^
--port 30000 ^
--logfile bin/debug.txt
echo Restarting server....
goto love_spaghetti_code
echo Done (this should never, ever, happen)