Bunuh hanya satu proses Java

16

Saya biasanya menjalankan beberapa aplikasi Java, satu untuk server berjalan secara lokal dan lainnya untuk beberapa IDE seperti NetBeans. Dan dari waktu ke waktu, setelah banyak penugasan kembali, server saya macet di OutOfMemoryException jadi saya harus mematikan proses Java untuk reboot.

Jadi saya lakukan pkill -9 javatetapi ini juga membunuh IDE saya yang sedang berjalan yang tidak saya inginkan. Jadi, bagaimana saya membunuh hanya aplikasi yang terhubung dengan menjalankan server dan bukan yang lain? Saya berasumsi bahwa mereka semua berjalan di bawah proses yang sama tetapi harus ada beberapa cara bagaimana menjauhkan mereka.

Petr Mensik
sumber
2
lihat tabel proses Anda (melalui topatau ps) dan pilih yang benar dan bunuh dengan PID (kill -9 PID_number).
buru
Oh ya, saya bisa melihatnya sekarang. Jadi saya hanya perlu mematikan proses dengan benar PID. Terima kasih banyak
Petr Mensik
Saya perlu mengotomatisasi ini. Bagaimana cara mendapatkan PID untuk program tertentu?
Nikhil VJ

Jawaban:

22

Untuk mematikan proses yang dikaitkan dengan beberapa proses, Anda harus mematikannya dengan menggunakan id proses yang terkait dengan proses itu.

Untuk mendapatkan id proses dari proses java yang dijalankan

ps -A |grep java

output dari perintah ini akan memberikan daftar proses java yang berjalan di sistem Anda. Catat ID Proses (PID) dari proses yang ingin Anda bunuh dan jalankan

kill -9 PID
P4cK3tHuNt3R
sumber
Jika Anda ingin membunuh SEMUA proses java dengan satu perintahps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
Andrii Karaivanskyi
11

IMO solusi terbaik adalah:

pkill -9 -f <nameOfYourJavaAplication>
Marek R
sumber
Sempurna. Saya dulu ps -fC javamenemukan nameOfYourJavaAplication(dalam -Dprogram.name)
cactuschibre
8

Alih-alih menggunakan psdan grep, Anda dapat menggunakan ps's -Cbendera untuk memilih semua perintah yang terdaftar dengan nama 'java'. Anda juga mungkin ingin menggunakan ps's -fbendera untuk mencetak nama perintah penuh dari setiap proses yang terdaftar. Dengan begitu, Anda dapat melihat apa yang sebenarnya dilakukan oleh setiap proses java. Berikut adalah perintah secara penuh: ps -fC java.

Anda juga bisa menggunakan pgrepdaftar proses java. pgrep -a javaakan mengembalikan PID dan baris perintah penuh dari setiap proses java.

Setelah Anda memiliki PID dari perintah yang ingin Anda bunuh, gunakan killdengan -9bendera (SIGKILL) dan PID dari proses java yang ingin Anda bunuh. Java tidak selalu berhenti ketika menerima sinyal 'SIGTERM' (proses diizinkan untuk menangani 'SIGTERM'), jadi mengirimkannya sinyal 'SIGKILL', yang membuat init mematikan program tanpa peringatan terlebih dahulu, seringkali diperlukan.

Misalnya, jika ps -fC javakembali

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

atau psgrep -a javakembali

9014 java IDE
11775 java TestProgram

dan Anda ingin membunuh java TestProgram, Anda harus lari kill -9 11775.


sumber
1

Jika Anda ingin skrip menemukan dan membunuh program Anda yang sedang berjalan (spesifik) menggunakan pola dari baris perintah program (dan bukan hanya setiap hal java yang Anda jalankan), maka:

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

Dari /unix//a/31111/249209

Nikhil VJ
sumber
Perhatikan bahwa "pkill" telah disebutkan dalam jawaban Marek R pada 13 Februari '13
Jeff Schaller
0

jpsdan jcmdmerupakan alat yang khusus menampilkan hanya informasi proses dan PID Java.

Anda dapat menjelajahi opsi mereka untuk hasil yang lebih terperinci.

Muhammad Gelbana
sumber
Itu hanya daftar sendiri di komputer saya.
Alexis Wilke
Lalu, apakah Anda yakin ada proses Java lain yang sedang berjalan ?!
Muhammad Gelbana
Iya. Saya meminta Cassandra atau Elassadra berlari saat menguji perintah Anda.
Alexis Wilke
0

Berikut ini adalah skrip yang dapat digunakan untuk mengotomatiskan proses.

Ganti <PROCESS_NAME>bagian dengan apa pun yang dijalankan java.

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

Catatan: Saya tidak meletakkan -9. Saya seharusnya tidak diminta kecuali Anda menangkap sinyal dan SIGTERM(default) gagal. Saya juga menyarankan Anda menggunakan nama sinyal yang membuatnya lebih mudah dibaca:

kill -TERM ${process}

PERINGATAN

Sebelum menjalankan, kill ...pastikan bahwa $processvariabel diatur seperti yang diharapkan. The ps -efMei berbeda antara beragam Unix sehingga awkmungkin perlu untuk mencetak parameter yang berbeda.

Catatan

Itu <PROCESS_NAME>bisa diubah menjadi variabel. Ingatlah bahwa jika Anda harus mengetiknya di baris perintah setiap kali, Anda mungkin akan membuat kesalahan sesekali. Saya merasa lebih mudah memiliki banyak salinan skrip dengan nama yang benar.

Juga penting: perhatikan tanda kutip tunggal untuk awkskrip. Itu berarti Anda harus menutup dan membuka kembali string dengan variabel di antaranya. Sesuatu seperti ini seharusnya bekerja (belum diuji):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
Alexis Wilke
sumber