Khi thực thi một ứng dụng Java, tên quy trình được gán cho nó thường là java.exe
hoặc javaw.exe
. Nhưng làm thế nào tôi có thể làm cho nó được gọi bằng tên của ứng dụng của tôi?cách thay đổi tên của quy trình đăng ký Java?
Trả lời
Kiểm tra launch4j, đó là trình bao bọc có thể thực thi cho phép bạn chỉ định tên thực thi.
Tính năng đã bị xóa vào năm 2013: Các thay đổi trong phiên bản 3.1.0-beta2 (20-08-2013) Đã xóa tính năng tên quy trình tùy chỉnh không được tương thích với các phiên bản Windows mới hơn. –
Đúng là launch4j không còn cho phép bạn thay đổi tên của quá trình javaw.exe. Tuy nhiên, nếu bạn tạo ra launch4j exe bằng cách sử dụng tùy chọn stayalive = true, thì tên quy trình cho tệp exe tùy chỉnh của bạn sẽ vẫn nằm trong danh sách các quy trình ngoài quy trình javaw.exe. Vì vậy, điều này cung cấp cho người dùng tùy chọn để giết quá trình java chính xác bằng cách giết chết quá trình với tên tùy chỉnh của bạn. – Enwired
Có, được kiểm tra trong Windows 10. Khi đúng, tên ứng dụng và biểu tượng của nó sẽ nằm trong trình quản lý tác vụ. Nhưng vấn đề là nếu tôi giết ứng dụng bằng tên tùy chỉnh của nó, nó sẽ không giết ứng dụng. – insyncim64
Trừ khi bạn khởi chạy Java qua JNI trong tệp thi hành được xây dựng tùy chỉnh của riêng bạn, tên quy trình sẽ luôn là java.exe.
Có một số trình khởi chạy/trình bao bọc java có thể tạo tệp thi hành này cho bạn.
... ngay cả khi bạn đổi tên * java.exe *? – SamB
Nếu bạn đang sử dụng JDK Sun, bạn có thể cũng sử dụng công cụ dòng lệnh "jps" để có danh sách chi tiết về các quy trình Java đang chạy trên hộp.
Các phương pháp này phù hợp cho các máy chủ có nhiều tiến trình java đang chạy và bạn cần tìm cách nhanh chóng để tìm đúng jvm (không sử dụng jps.) Đối với các ứng dụng, tôi cho rằng launch4j hoặc trình bao bọc khác là con đường để đi .
Trên unix, Nếu bạn đang tung ra từ một sript vỏ (ít nhất là cho bash và có thể cho vỏ đàng hoàng khác), bạn có thể sử dụng:
exec -a goodname java ...
để khởi động java
và vượt qua "goodname" như là đối số 0 , tên này sẽ được hiển thị dưới dạng tên quy trình trong ps
, v.v.
Phương án thay thế tốt hơn (có vẻ như cũng hoạt động cho top
) là tạo liên kết tượng trưng: ln -s /usr/bin/java /usr/local/bin/kallekula
.
Phím tắt trong cửa sổ sẽ không thực hiện thủ thuật, nhưng windows vista/7 hỗ trợ các liên kết tượng trưng bằng cách sử dụng mklink
. Điều đó có thể hiệu quả, nhưng tôi chưa thử nghiệm. Tôi không chắc chắn nếu exec -a
cũng hoạt động với cygwin bash trên Windows.
Giả sử rằng những gì bạn đang thực sự sau khi là một cách để chấm dứt đúng đúng quy trình sau này, sau đó là một giải pháp thay thế là thế này:
Run ps -ef | grep java
và bạn sẽ nhận được một danh sách mà trông giống như sau:
mruser 7518 7505 4 11:37 pts/3 00:00:00 /usr/bin/java -classpath MRD3030_Linked.jar peralex.MyApp
Sau đó, pkill -f peralex.MyApp
sẽ giết quá trình chính xác.
Lưu ý rằng chỉ hoạt động nếu dòng lệnh/nhớ/không bị cắt bớt bởi hệ thống. Cả Linux và Solaris đều có giới hạn về độ dài của dòng lệnh được ghi nhớ (độc lập với mức tối đa được chấp nhận), và bạn dễ dàng vượt quá điều đó với một đường dẫn lớp dài. – ankon
Không phải tất cả các hương vị của exec đều hỗ trợ cờ -a. Nếu không, chương trình argv0 sẽ thực hiện tương tự.
Điều này dành riêng cho Windows.
Tôi đang đối mặt với cùng một vấn đề mà tôi phải giết chương trình java cụ thể bằng cách sử dụng taskkill.Khi tôi chạy chương trình java, danh sách tác vụ đang hiển thị cùng một chương trình với Tên hình ảnh được đặt là java.exe. Nhưng hãy giết nó bằng cách sử dụng taskkill/F java.exe sẽ ngừng tất cả các ứng dụng java khác ngoài dự định không bắt buộc.
Vì vậy, tôi chạy chương trình java tương tự sử dụng:
bắt đầu "MyProgramName" java java-chương trình ..
Đây bắt đầu lệnh sẽ mở ra một cửa sổ mới và chạy chương trình java với tiêu đề của cửa sổ được đặt thành MyProgramName.
Bây giờ để kil này java-chương trình sử dụng lệnh taskkill sau:
taskkill/fi "MyProgramName"
chương trình Java của bạn sẽ bị giết mà thôi. Phần còn lại sẽ không bị ảnh hưởng.
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.
Giải pháp tốt! Nhưng chỉ Linux. –
liên quan: [Cách thay đổi argv0 trong bash để lệnh hiển thị với tên khác trong ps?] (Http://stackoverflow.com/questions/3251550/how-to-change-argv0-in-bash-so- command-shows-up-with-different-name-in-ps) – jfs