Yalnızca bir Java işlemini öldür


17

Genellikle birkaç Java uygulaması çalıştırıyorum, biri yerel olarak çalışan, diğeri NetBeans gibi bazı IDE için. Ve zaman zaman, çok sayıda yeniden dağıtımdan sonra, sunucum OutOfMemoryException üzerinde takılıp böylece yeniden başlatmak için Java işlemini öldürmek gerekir.

Bu yüzden yapıyorum pkill -9 javaama bu da istemediğim çalışan IDE'mi öldürüyor. Öyleyse sadece çalışan sunucuya bağlı uygulamayı nasıl öldürürüm, diğerini değil mi? Hepsinin aynı süreç altında çalıştığını varsayıyorum, ancak onları nasıl dağıtacağımızın bir yolu olmalı.


2
işlem tablonuza bakın ( topveya aracılığıyla ps) ve doğru olanı seçin ve PID ile öldürün (kill -9 PID_number).
acele

Ah evet, şimdi görebiliyorum. Bu yüzden süreci haklı olarak öldürmem gerekiyor PID. Çok teşekkürler
Petr Mensik

Bunu otomatikleştirmem gerekiyor. Belirli bir program için PID nasıl alınır?
Nikhil VJ

Yanıtlar:


24

Birden çok işlemle ilişkili bir işlemi öldürmek için, söz konusu işlemle ilişkilendirilmiş işlem kimliğini kullanarak bunu öldürmeniz gerekir.

Java sürecinin işlem kimliğini çalıştırmak için

ps -A |grep java

Bu komutun çıktısı sisteminizde çalışan java işlemlerinin listesini verecektir. Öldürmek ve çalıştırmak istediğiniz işlemin İşlem Kimliğini (PID) not edin

kill -9 PID

TÜM java süreçlerini tek bir komutla öldürmek istiyorsanızps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
Andrii Karaivanskyi

11

IMO'nun en iyi çözümü:

pkill -9 -f <nameOfYourJavaAplication>

Mükemmel. Ben ps -fC javabuldum nameOfYourJavaAplication(in -Dprogram.name)
cactuschibre

8

Bunun yerine kullanmanın psve grepkullanabileceğiniz ps'ın -Cjava 'adıyla listelenen tüm komutları seçmek için bayrağı'. Ayrıca listelenen her işlemin tam komut adını yazdırmak için ps' -fbayrağını ' kullanmak isteyebilirsiniz . Bu şekilde, her bir java işleminin gerçekte ne yaptığını görebilirsiniz. İşte tam olarak komut: ps -fC java.

pgrepTüm java işlemlerini listelemek için de kullanabilirsiniz . pgrep -a javaher java işleminin PID ve tam komut satırını döndürür.

Öldürmek istediğiniz komutun PID'sini aldıktan sonra kill, -9(SIGKILL) bayrağı ve öldürmek istediğiniz java işleminin PID'sini kullanın. Java 'SIGTERM' sinyali aldığında (işlemlerin 'SIGTERM' işlemesine izin verilir) her zaman durmaz.

Örneğin, ps -fC javageri dönüş

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

veya psgrep -a javadöner

9014 java IDE
11775 java TestProgram

ve öldürmek java TestProgramistiyorsan koşmalısın kill -9 11775.


1

Bir komut dosyasının (belirli) çalışan programınızı, programın komut satırından bir desen kullanarak (ve yalnızca çalıştırdığınız her java şeyini değil) bulup öldürmesini istiyorsanız, o zaman:

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

Gönderen /unix//a/31111/249209


Marek R'in 13 Şubat 13
Jeff Schaller

0

jpsve jcmdyalnızca Java işlemleri bilgilerini ve PID'lerini görüntüleme konusunda uzmanlaşmış araçlardır.

Daha ayrıntılı bir çıktı için seçeneklerini inceleyebilirsiniz.


Sadece kendilerini bilgisayarımda listeliyorlar.
Alexis Wilke

Sonra, çalışan başka Java işlemleri olduğundan emin misiniz?!
Muhammad Gelbana

Evet. Komutunu test ederken Cassandra veya Elassadra'yı çalıştırdım.
Alexis Wilke

0

İşte bir süreci otomatikleştirmek için kullanabileceğiniz bir komut dosyası.

Parçayı <PROCESS_NAME>java yürüttüğü ile değiştirin .

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

Not: Ben koymadım -9. Eğer sinyal yakalamak ve SIGTERM(varsayılan) başarısız sürece ben gerekli olmamalıdır . Ayrıca okumayı kolaylaştıran sinyal adını kullanmanızı öneririm:

kill -TERM ${process}

UYARI

Yürütmeden önce değişkenin beklendiği gibi ayarlandığından kill ...emin olun $process. ps -efUnix'lerde arasındaki mayıs farklıdır, dolayısıyla awkfarklı bir parametre yazdırmak gerekebilir.

Not

<PROCESS_NAME>Bir değişkene değiştirilebilir. Her seferinde komut satırınıza yazmak zorunda kalırsanız, arada bir hata yapacağınızı unutmayın. Komut dosyasının birden çok kopyasının doğru adla olmasını daha kolay buluyorum.

Ayrıca önemli: awkkod için tek tırnak dikkat edin . Bu, arasındaki değişkeni içeren dizeyi kapatıp yeniden açmanız gerektiği anlamına gelir. Böyle bir şey olmalıdır (denenmemiş) çalışması:

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.