2009-06-22 42 views
19

Tôi quan tâm đến các cách tiếp cận khác nhau để tắt chương trình dòng lệnh Java một cách duyên dáng. Gửi tín hiệu giết không phải là một tùy chọn.Cách tốt nhất để tắt máy một cách nhanh chóng Chương trình dòng lệnh Java

Tôi có thể nghĩ ra một vài cách tiếp cận khác nhau.

  1. Mở cổng và đợi kết nối. Khi một được thực hiện, tắt máy duyên dáng.
  2. Xem tệp để tạo, sau đó tắt.
  3. Đọc một số đầu vào từ thiết bị đầu cuối, chẳng hạn như "thực thi tắt".

Lý do thứ ba không lý tưởng vì thường có đầu ra chương trình được bơm lên màn hình. Người đầu tiên mất quá nhiều công sức (tôi lười biếng). Hầu hết các lập trình viên có sử dụng tùy chọn thứ hai không? Nếu không, những gì khác là có thể/thanh lịch/đơn giản?

+0

Bạn có nghĩa là cho một quá trình để tiêu diệt chương trình dòng lệnh java của bạn? – Tom

+2

Tại sao gửi tín hiệu giết không phải là một tùy chọn? Như đã đề cập trong các câu trả lời dưới đây, bạn có thể nắm bắt và xử lý tín hiệu giết một cách duyên dáng với móc tắt máy. – toluju

Trả lời

2

Tùy chọn hai đầu tiên rất đơn giản để triển khai. Bạn cũng có thể sử dụng một số công cụ JMX (Tôi không biết nhiều về điều đó). Tomcat sử dụng cách tiếp cận đầu tiên và tôi áp dụng 1 và 2 trong hai dự án của tôi.

9

bạn có thể thử sử dụng Runtime.getRuntime().addShutdownHook() để đáp ứng yêu cầu của bạn. Bằng cách này, bạn có thể đăng ký một móc để làm sạch, để perfom tắt một gracefull.

EDIT

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread) public void addShutdownHook (Chủ đề móc) Đăng ký một ảo máy móc tắt máy mới. Các máy ảo Java tắt để đáp ứng với hai loại sự kiện:

  • Chương trình thoát bình thường, khi phi daemon chủ đề thoát cuối cùng hoặc khi exit (tương đương, System.exit) phương pháp được gọi, hoặc
  • Máy ảo bị chấm dứt khi người dùng ngắt, chẳng hạn như gõ^C hoặc sự kiện toàn hệ thống, chẳng hạn như đăng xuất người dùng hoặc tắt hệ thống.
+0

Điều đó không hoạt động khi cntrl + c được thực hiện. –

+0

Nhưng mike, đó là cách để làm giảm một cách duyên dáng, nếu một ctrl + c được nhấn, bất kỳ chương trình cmd nào cũng sẽ được kết thúc bằng một tín hiệu giết. –

+0

Không có tùy chọn nào khác mà bạn đã đề cập, dù vậy, hành vi trên ctrl + c có thể không liên quan đến việc quyết định một trong các phương pháp này. – Herms

16

bạn có thể thử một cái gì đó như thế này:

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { /* 
     my shutdown code here 
    */ } 
}); 

chỉnh sửa:

móc tắt máy sẽ không thực hiện việc tắt của ứng dụng. thay vào đó, nó cung cấp cho các nhà phát triển một cách để thực hiện bất kỳ làm sạch mà anh/cô ấy mong muốn lúc tắt máy.

từ javadoc cho Runtime (đọc tốt nếu bạn đang có kế hoạch để sử dụng phương pháp này):

Một móc tắt máy chỉ đơn giản là một chủ đề khởi tạo nhưng Unstarted. Khi máy ảo bắt đầu trình tự tắt máy của nó, nó sẽ bắt đầu tất cả các móc tắt đã đăng ký trong một số thứ tự không xác định và cho phép chúng chạy đồng thời. Khi tất cả các móc đã hoàn thành, nó sẽ chạy tất cả các finalizers chưa được giải quyết nếu finalization-on-exit đã được kích hoạt. Cuối cùng, máy ảo sẽ dừng lại. ...

+0

Làm thế nào để tắt chương trình của mình? –

+0

đã chỉnh sửa. tôi hy vọng rằng địa chỉ câu hỏi của bạn. – akf

+0

Không nên chạy phương pháp có chú thích @Override? –

5

Lợi ích của tùy chọn thứ hai - kiểm tra tệp - qua lần đầu tiên - nghe trên cổng - là bạn có khả năng bảo mật.

Bạn có thể đặt quyền trên thư mục nơi tệp được tạo để chỉ những người dùng thích hợp mới có thể đóng chương trình. Nếu bạn nghe trên một cổng bất kỳ người dùng nào có thể kết nối với nó.

+0

Bạn có thể giới hạn các cuộc gọi đến dựa trên địa chỉ IP của máy khách. Ví dụ: chỉ cho phép kết nối từ máy chủ cục bộ. Bạn chỉ thoát khi nó là địa chỉ IP thích hợp, nếu không đóng kết nối và tiếp tục nghe một địa chỉ mới. – akarnokd

+0

@ kd304 - Hạn chế địa chỉ IP vẫn cho phép bất kỳ người dùng nào trên hệ thống cục bộ tắt quy trình. Bằng cách đặt quyền trên thư mục, bạn chỉ có thể cho phép một người dùng cụ thể kiểm soát quá trình. –

0

Tôi khuyên bạn nên sử dụng móc tắt máy. Nó sẽ cho phép chương trình của bạn được kiểm soát bằng cách sử dụng các công cụ OS tiêu chuẩn. Nó cũng không cần bất kỳ quyền truy cập bổ sung vào tài nguyên bên ngoài (đĩa, cổng, bất cứ điều gì).

2

Nếu bạn muốn sử dụng phiên bản socket, nó rất đơn giản để thực hiện. Đây là mã:

ServerSocket server = new ServerSocket(8080); 
System.out.println("Socket listening!"); 
server.accept(); 
System.out.println("Connection received!"); 

Bạn có thể dễ dàng nhúng mã này vào một chuỗi riêng biệt mà bạn bắt đầu với chương trình của mình và sau đó sửa đổi trạng thái toàn cục để bắt đầu tắt máy.

1

Cân nhắc việc có thành phần JMX. Sau đó, bạn có thể đính kèm với JConsole tại địa phương hoặc trên mạng và liên lạc với thành phần của bạn. Sau đó, thành phần có thể tắt chương trình đúng cách.

Với Java 6 u 10 trở lên, bạn có thể thực hiện tương tự với JVisualVM.

Các vấn đề liên quan