Chỉ giết một tiến trình Java


16

Tôi thường chạy một vài ứng dụng Java, một cho máy chủ chạy cục bộ và một cho IDE như NetBeans. Và thỉnh thoảng, sau rất nhiều lần triển khai lại, máy chủ của tôi bị kẹt trên OutOfMemoryException vì vậy tôi cần phải giết tiến trình Java để khởi động lại.

Vì vậy, tôi làm pkill -9 javanhưng điều này cũng giết chết IDE đang chạy của tôi mà tôi không muốn. Vì vậy, làm thế nào để tôi chỉ giết ứng dụng được liên kết với máy chủ đang chạy chứ không phải các ứng dụng khác? Tôi cho rằng tất cả chúng đều đang chạy theo cùng một quy trình nhưng phải có cách nào đó để phân tâm chúng.


2
nhìn vào bảng quy trình của bạn (thông qua tophoặc ps) và chọn đúng và hủy nó bằng PID (kill -9 PID_number).
vội vàng

Ồ vâng, tôi có thể thấy điều đó bây giờ. Vì vậy, tôi chỉ cần giết quá trình với quyền PID. Cảm ơn rất nhiều
Petr Mensik

Tôi cần phải tự động hóa điều này. Làm thế nào để có được PID cho chương trình cụ thể?
Nikhil VJ

Câu trả lời:


22

Để giết một quy trình được liên kết với nhiều quy trình, bạn cần phải giết quy trình đó bằng cách sử dụng id quy trình được liên kết với quy trình đó.

Để có được id tiến trình của quá trình java đó chạy

ps -A |grep java

đầu ra của lệnh này sẽ đưa ra danh sách các tiến trình java đang chạy trên hệ thống của bạn. Ghi lại ID tiến trình (PID) của quá trình mà bạn muốn giết và chạy

kill -9 PID

Nếu bạn muốn tiêu diệt TẤT CẢ các quy trình java bằng một lệnhps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
Andrii Karaivanskyi

11

IMO giải pháp tốt nhất là:

pkill -9 -f <nameOfYourJavaAplication>

Hoàn hảo. Tôi đã từng ps -fC javatìm nameOfYourJavaAplication(trong -Dprogram.name)
cactuschibre

8

Thay vì sử dụng psgrepbạn có thể sử dụng ps's -Ccờ để chọn tất cả các lệnh được liệt kê với tên 'java'. Bạn cũng có thể muốn sử dụng ps's -fcờ để in tên lệnh đầy đủ của mỗi quá trình niêm yết. Bằng cách đó, bạn có thể thấy mỗi quá trình java thực sự đang làm gì. Đây là lệnh đầy đủ : ps -fC java.

Bạn cũng có thể sử dụng pgrepđể liệt kê tất cả các quy trình java. pgrep -a javasẽ trả về PID và dòng lệnh đầy đủ của mỗi quá trình java.

Khi bạn đã có lệnh PID mà bạn muốn giết, hãy sử dụng killvới -9cờ (SIGKILL) và PID của quy trình java mà bạn muốn giết. Java không phải lúc nào cũng dừng khi nhận được tín hiệu 'SIGTERM' (các quy trình được phép xử lý 'SIGTERM'), do đó, gửi tín hiệu 'SIGKILL', điều này khiến init giết chương trình mà không cần cảnh báo trước, thường là cần thiết.

Ví dụ: nếu ps -fC javatrả về

UID        PID  PPID  C STIME TTY          TIME CMD
jeff      9014  8890  0 08:51 pts/0    00:00:00 java IDE
jeff     11775  8890  6 08:59 pts/0    00:00:00 java TestProgram

hoặc psgrep -a javatrả lại

9014 java IDE
11775 java TestProgram

và bạn muốn giết java TestProgram, bạn nên chạy kill -9 11775.


1

Nếu bạn muốn một tập lệnh tìm và giết chương trình đang chạy (cụ thể) của mình bằng cách sử dụng một mẫu từ dòng lệnh của chương trình (và không chỉ mọi thứ java bạn đang chạy), thì:

pgrep -f pattern # shows the PID
pkill -f pattern

Từ /unix//a/31111/249209


Lưu ý rằng "pkill" đã được đề cập trong câu trả lời của Marek R vào ngày 13 tháng 2 năm 13
Jeff Schaller

0

jpsjcmdlà các công cụ chuyên chỉ hiển thị các thông tin và quy trình xử lý Java.

Bạn có thể khám phá các tùy chọn của họ để có đầu ra chi tiết hơn.


Những người chỉ liệt kê chính họ trên máy tính của tôi.
Alexis Wilke

Sau đó, bạn có chắc chắn có các quy trình Java khác đang chạy không?!
Muhammad Gelbana

Đúng. Tôi đã chạy Cassandra hoặc Elassadra khi kiểm tra lệnh của bạn.
Alexis Wilke

0

Đây là một kịch bản người ta có thể sử dụng để tự động hóa quá trình.

Thay thế <PROCESS_NAME>phần bằng bất cứ điều gì java đang thực hiện.

#!/bin/sh
process=`ps -ef | grep -v awk | awk -e '/java.*<PROCESS_NAME>/ { print $2 }'`
kill ${process}

Lưu ý: Tôi đã không đặt -9. Tôi không nên được yêu cầu trừ khi bạn bắt tín hiệu và SIGTERM(mặc định) không thành công. Tôi cũng đề nghị bạn sử dụng tên tín hiệu để dễ đọc hơn:

kill -TERM ${process}

CẢNH BÁO

Trước khi thực hiện, kill ...đảm bảo rằng $processbiến được đặt như mong đợi. Có ps -efthể khác nhau giữa các Thông báo vì vậy awkcó thể cần in một tham số khác.

Ghi chú

<PROCESS_NAME>thể được thay đổi thành một biến. Chỉ cần nhớ rằng nếu bạn phải gõ nó trên dòng lệnh của bạn mỗi lần, bạn có thể sẽ mắc lỗi một lần. Tôi thấy dễ dàng hơn khi có nhiều bản sao của tập lệnh với tên chính xác.

Cũng quan trọng: chú ý các trích dẫn duy nhất cho awkkịch bản. Điều đó có nghĩa là bạn cần đóng và mở lại chuỗi với biến ở giữa. Một cái gì đó như thế này sẽ hoạt động (chưa được kiểm tra):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.