Tiêu diệt các tiến trình Java


25

Tôi đang làm việc với một mã nặng tính toán mà hiện tại - gặp sự cố rất nhiều, nhưng tôi vẫn đang làm việc với nó :) Khi nó gặp sự cố, tôi không thể đóng cửa sổ GUI; Tôi phải mở một cái vỏ và giết -9 quá trình.

Đây là một quy trình Java và rất dễ tìm thấy:

nkint@zefiro:~$ ps aux | grep java
nkint   2705 16.6  1.0 460928 43680 ?        Sl   12:23   0:08 /usr/lib/jvm/java-6-sun-1.6.0.26/bin/java -Djava.library.path=something something
nkint   2809  0.0  0.0   4012   776 pts/0    S+   12:24   0:00 grep --color=auto java
nkint@zefiro:~$ kill -9 2705

Bây giờ nó dễ dàng nhưng khá là một nhiệm vụ cơ học. Vì vậy, thông thường tôi chờ khoảng 7-8 quá trình sụp đổ, và sau đó kill -9mỗi quá trình .

Tôi muốn làm điều này một cách tự động. Tôi nghĩ rằng thật dễ dàng để thực hiện một số lệnh để lấy id của kết quả (n-1) ps aux | grep javavà giết nó nhưng tôi không biết bắt đầu từ đâu.

Bất cứ ai có thể cho tôi bất kỳ gợi ý?

Câu trả lời:


22

Một vài đường ống sẽ đưa bạn đến nơi bạn muốn. Đây là cách tôi làm:

search_terms='whatever will help find the specific process' 

kill $(ps aux | grep "$search_terms" | grep -v 'grep' | awk '{print $2}')

Đây là những gì đang xảy ra:

grep -v 'grep' không bao gồm quá trình grep từ kết quả

awk '{print $2}' chỉ in cột thứ 2 của đầu ra (trong trường hợp này là PID)

$(...)là lệnh thay thế. Về cơ bản, kết quả từ lệnh bên trong sẽ được sử dụng làm đối số chokill

Điều này có lợi ích của việc kiểm soát tốt hơn đối với những gì bị giết. Ví dụ: nếu bạn đang ở trên một hệ thống dùng chung, bạn có thể chỉnh sửa các cụm từ tìm kiếm để nó chỉ cố gắng giết các quá trình java của riêng bạn.


49

Nếu bạn muốn giết tất cả các quy trình được đặt tên, javabạn có thể sử dụng lệnh sau:

killall -9 java

Lệnh này sẽ gửi tín hiệu đến các quá trình được xác định bằng tên của chúng.


killall javakhông làm việc cho tôi vì một số lý do ngẫu nhiên mà tôi không thể giải quyết. Các -9tham số đã chăm sóc điều đó. Cảm ơn bạn.
Paul Nelson Baker

5
9 là SIGKILL. Chương trình không thể bỏ qua nó, và về cơ bản nó nói: chấm dứt chính bạn ngay bây giờ.
Milan Todorovic

Người dùng IntelliJ có thể thấy IDE của họ đã bị sập không đề cập đến Tomcat và nhiều ứng dụng khác. Đây là một cách mạnh mẽ và không được khuyến nghị trên bất kỳ hệ thống nào có các dịch vụ hoặc ứng dụng năng suất dựa vào java.
tresf

3

Mở trình soạn thảo văn bản và lưu tập lệnh bash ngắn này trong thư mục chính của bạn dưới dạng 'killjava'

#! /bin/bash

# Kill Java process

# Determine the pid
PID=`ps -C java -o pid=`

kill -9 $PID

Sau đó chmod u+x ~/killjavatrong một thiết bị đầu cuối để bạn có thể thực hiện các tập tin.

Sau đó, bạn có thể chỉ cần gọi ~/killjavatừ một thiết bị đầu cuối và quy trình Java của bạn sẽ bị chết. Bạn có thể muốn xem xét những tài nguyên nào khác mà việc giết quá trình Java của bạn theo cách này (chẳng hạn như các kết nối cơ sở dữ liệu) sẽ bị ảnh hưởng. Ví dụ, có lẽ kill -15sẽ phù hợp hơn - xem giải thích ở đây .


2

Đây là một cách tiếp cận khác, dựa trên câu trả lời trước đó của @ Dean.

Điều này sử dụng jps để xác định quá trình java.

kill $(jps | grep <MainClass> | awk '{print $1}')

MainClass là một lớp trong chương trình java đang chạy của bạn có chứa phương thức chính.

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.