2009-06-29 48 views
49

Nếu một chương trình Java được bắt đầu, nó nhận được trong quá trình hệ thống giám sát tên java. Nhiều chương trình Java là cách khó phân biệt. Vì vậy, nó sẽ được tốt đẹp, nếu một cách tồn tại, để thiết lập tên, sẽ được hiển thị trong quá trình giám sát. Tôi biết rằng điều này có thể hoạt động khác nhau trên các Hệ điều hành khác nhau.Làm cách nào để đặt tên quy trình cho chương trình Java?

Một cách đơn giản sẽ là, nếu java-phiên dịch sẽ hỗ trợ một chuyển đổi để đặt tên, như thế này:

java -processname MyProgram -jar MyProgram 

Nhưng tôi không thể tìm thấy một công tắc như vậy, vì vậy nó có lẽ là phi tồn tại. Một API trong Java để thiết lập tên quá trình cũng sẽ tốt.

Vì vậy, bạn có bất kỳ đề xuất nào không?

Trả lời

40

Tôi không biết nếu điều này là có thể, nhưng bạn có thể sử dụng một công cụ dòng lệnh đi kèm với JDK được gọi là 'jps'. Nó giống như * nix ps, nhưng thay vào đó chỉ là các chương trình Java. jps -v hiển thị tất cả đối số bạn đã chuyển đến java.

Ngoài ra, tôi đã thấy mọi người đính kèm "tên quy trình" vào quy trình java của họ bằng cách thêm -Dmyprocessname chưa sử dụng vào nhóm.

+0

Không chính xác câu trả lời mà tôi đã hỏi, nhưng chính xác câu trả lời đúng cho vấn đề của tôi. Cảm ơn. :-) – Mnementh

+0

Vì thiếu setproctitle đây là một giải pháp thông minh. Thanh danh. – synthesizerpatel

+1

Tôi cũng đang tìm các tùy chọn tương tự. Nhưng câu trả lời này không rõ ràng với tôi. Ai đó có thể giải thích cho tôi cách đặt tên quy trình. Tôi thấy có một tùy chọn gọi là '-D = giá trị'. Chúng ta có cần sử dụng tùy chọn này không? Cảm ơn. – Naresh

1

Đó là vì các ứng dụng Java không thực sự thực thi chúng được chạy bởi máy ảo Java, đó là lý do tại sao java xuất hiện trong trình theo dõi quá trình, đó là máy chủ của ứng dụng của bạn.

Những điều như LimeWire tuy nhiên làm nhưng tôi nghĩ đó là hơn xuống GCJ - http://gcc.gnu.org/java/

2

Nếu bạn muốn sử dụng một tên quá trình khác nhau mà bạn sẽ phải tạo nhị phân của riêng bạn để khởi động ứng dụng Java của bạn sử dụng một cái gì đó giống như JSmooth .

Look at this question để thảo luận về việc tạo các tệp nhị phân đó.

5

Khi lần đầu tiên tôi đọc điều này, ý tưởng thay đổi tên quy trình đã khiến tôi không thể. Tuy nhiên, theo this ancient thread on the sun forum bạn có thể sử dụng trình bao bọc C++ xung quanh JVM thực thi để đạt được điều này.

Mặc dù thẳng thắn, tôi tự hỏi vấn đề thực sự của bạn là gì, vì tôi đoán có một giải pháp tiêu chuẩn hơn sau đó cố gắng thay đổi tên quy trình.

+3

Nếu bạn phải giết ứng dụng của mình và có một số ứng dụng Java đang chạy nó sẽ là một cú đánh nhỏ và bỏ lỡ. – Lloyd

+1

Bạn nói đúng, lệnh jps được omerkudat đề cập giải quyết vấn đề mà không cần đổi tên các quy trình. – Mnementh

+2

tạo một trình bao bọc JNI nhỏ để khởi chạy ứng dụng cũng rất dễ dàng. Đối với những người trong chúng ta triển khai Windows, nó cho phép cấu hình tự động của JVM, các biểu tượng tùy chỉnh, v.v ... Nó thực sự không khó làm. –

16

như @omerkudat nói:

jps -v 

in ra tất cả các quy trình java {processID, danh sách params} Nếu danh sách thông số không đủ để nhận ra các ứng dụng bạn cần, thử thêm một số params giả khi chạy chúng:

java -Dname=myApp -cp myApp.jar some.client.main.MainFrame 

này sẽ in như:

7780 MainFrame -Dname=myApp 

và bạn có thể sử dụng quá trình ID để giết/giám sát nó.

10

Bạn có thể làm điều này với một LD_PRELOAD shim: https://github.com/airlift/procname

Các shim chỉ đơn giản gọi là Linux cụ thể prctl() khi quá trình khởi động:

static void __attribute__ ((constructor)) procname_init() 
{ 
    prctl(PR_SET_NAME, "myname"); 
} 

Cuộc gọi có thể xảy ra trên các chủ đề chính, vì vậy không thể thực hiện điều này từ Java hoặc thậm chí với một tác nhân JVMTI, vì những điều đó xảy ra trên một luồng khác.

+1

Điều này hoạt động thực sự tốt và là một cách tiếp cận đơn giản hơn hầu hết ở đây –

+0

Tôi sẽ xem xét sử dụng mã này nếu mã được cấp phép theo MIT, Apache hoặc một số thỏa thuận cấp phép khác. –

+4

Mã này quá tầm thường (nó chỉ gọi một hàm) mà nó thậm chí không có vẻ có bản quyền. Vui lòng xem xét miền công cộng. Nếu bạn muốn, tôi có thể thêm tệp LICENSE. –

1

Có hai cách tiếp cận chủ yếu: một là đã được mô tả: sử dụng các công cụ như Launch4j, WinRun4J để tạo các bản khởi chạy Windows gốc.

Một cách tiếp cận khác có vẻ tốt hơn là sử dụng Apache Procrun để bao bọc ứng dụng java dưới dạng dịch vụ Windows. Trong quá trình cài đặt dịch vụ, chúng tôi có thể cung cấp cho quá trình một tên có ý nghĩa như OurApp.exe.

Tất cả những gì chúng tôi cần làm là đổi tên prunsrv.exe thành OurApp.exe và thay thế mọi lần xuất hiện của prunsrv.exe trong phần cài đặt của chúng tôi | bắt đầu | dừng | gỡ cài đặt dịch vụ tập lệnh vào MyApp.exe.

Xem thêm từ Using Apache Procrun to Rename Process Name of a Java Program in Windows

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