2010-01-25 15 views
11

Czy istnieje sposób, aby zatrzymać program Java uruchomiony przy użyciu skrypt znając alone.I nazwy używam KSH ShellShell skrypt, aby zatrzymać program Java

+1

wiedząc, co się nazywa? Jeśli znasz nazwę pliku wykonywalnego (który zwykle jest 'java'),' killall' jest twoim przyjacielem. – sfussenegger

+0

@sfussenegger: Prawdopodobnie nie chce zabić wszystkich procesów Java, ale tylko jeden konkretny. – Mnementh

+0

@Mnementh też tego oczekuję, ale z podanej informacji jest to najlepsza rzecz, jaką mogę polecić. – sfussenegger

Odpowiedz

6

Dodaj unikalną właściwość do JVM w celu łatwej identyfikacji, np. dla test.class

java -Duniquename=1 test 

go zabić:

ps ax | grep uniquename | grep -v grep | awk '{print $1}' | xargs kill 
+0

Jego błąd rzucania. Używam powłoki ksh – Harish

+0

jaki błąd otrzymujesz? –

+0

Działa poprawnie pod KSH. Być może popełniłeś błąd podczas kopiowania polecenia. – diciu

1

Można użyć pkill:

pkill your_java_program_name 

To działałoby, jeśli uruchomisz tylko jedną instancję uruchomionego programu.

3

Można użyć jps identyfikującego identyfikator procesu powiązany z nazwą uruchomionego programu java (jps jest menedżerem procesów dla programów java). Za pomocą tego identyfikatora możesz normalnie zabić proces.

+0

zakładając, że moja nazwa pliku java to test.java i działa, jak go znaleźć? – Harish

+0

+1 za wprowadzenie mnie do jps :) – sfussenegger

+0

@Harish: Po skompilowaniu i wykonaniu zostanie wyświetlony jako "test". Jeśli zapiszesz go w pliku wykonywalnego jar (test.jar) i wykonasz za pomocą "java -jar test.jar" jps wyświetli "test.jar". – Mnementh

20

ślad za Mnementh' suggestion:

to powinno załatwić sprawę

jps -l | grep org.example.MyMain | cut -d ' ' -f 1 | xargs -rn1 kill 
  • jps -l: lista java zawodowiec cess z "pełną nazwą pakietu dla głównej klasy aplikacji lub pełną ścieżką do pliku JAR aplikacji."

  • grep: wybierz proces chcesz

  • cut -d -' ' -f 1: Split wyjście w kolumnach z wykorzystaniem separatora '' i drukować tylko pierwsza (PID)

  • xargs -rn1 kill: wykonać zabić każdego PID (jeśli w ogóle)

pamiętać, że należy uruchomić JPS i xargs z tego samego użytkownika (lub root) jak używasz proces

+1

+1 za każde "wow" Powiedziałem w każdej linii.:) – Nishant

+1

Będzie to również działać na komputerach z systemem Windows, ale będziesz musiał przeprowadzić wykrywanie środowiska, aby dowiedzieć się, które 'kill' użyć. –

+0

@Odelya Właśnie dodałem '-r' (' --no-run-if-empty') do 'xargs', aby uniknąć tego błędu. – sfussenegger

1

można użyć opcji -o ps sformatować wyjście,

ps -eo cmd,pid | awk '!/awk/&&/mycommand/{cmd="kill -9 "$2;system(cmd)}' 
Powiązane problemy