2016-05-31 24 views
2

Ich benutze untenstehendes Skript, um Prozesse zu finden und zu beenden, aber es funktioniert irgendwie nicht. Bitte helfen Sie, wenn es einen Fehler gibt. Ich greping JVM. AIX-Maschine verwendenShell Script kann den Prozess nicht beenden

PID=`ps -eaf | grep JVM| grep -v grep | awk '{print $2}'` 
    if [[ "" != "$PID" ]] 
    then 
     echo "killing $PID" 
     kill $PID 
    else 
     echo "PID not found" 

    fi 
+0

Das 'if' ist besser geschrieben als' if [["x"! = "X $ PID"]] ', dies stellt sicher, dass'! = 'Für den Stringvergleich verwendet wird (als Bonus sorgt es auch dafür, dass' grep 'Abfragen werden in verschiedenen Shells korrekt behandelt. – grochmal

+0

Der Code sieht im Grunde korrekt aus - Sie könnten das, was Sie mit "shomehow nicht funktioniert" meinen, aber wir gehen davon aus, dass der Prozess den Kill überlebt. Wenn dir die Antwort von Neil Ellis nicht hilft, müsstest du mehr erklären. - Was ich mache, wenn ich fixe Strings aus der PS-Ausgabe lösche, ist wie 'ps -eaf | grep '[J] VM'' .. das benötigt 'grep -v grep' nicht, da der grep-Befehl nicht mit dem regex übereinstimmt –

Antwort

2

Vom Wikipedia entry:

In Unix- und Unix-ähnlichen Betriebssystemen, töten ist ein Befehl verwendet, um ein Signal an einen Prozess senden. Die gesendete Nachricht ist standardmäßig das Beendigungssignal, das den Prozess zum Beenden auffordert. Aber töten ist etwas von einer falschen Bezeichnung; Das gesendete Signal hat möglicherweise nichts mit Prozessabtötung zu tun.

So standardmäßig Kill sendet SIGTERM (entspricht -15 zu töten) Sie wahrscheinlich SIGKILL tun müssen, um:

kill -9 $PID 

oder wenn Sie besonders vorsichtig gewesen, oder Sie müssen das System zum Herunterfahren anmutig dann empfehle ich Ihnen, SIGINT zu verwenden, da es dasselbe wie Ctrl-C auf der Tastatur ist. So

kill -2 $PID 

Java-Anwendungen Ich habe Angst doesn't always handle SIGTERM correctly sie stützen sich auf ein gutes Verhalten in den Shutdown-Haken. Um sicherzustellen, dass eine App richtig Signale behandelt wie SIGTERM Sie direkt das SIGTERM Signal verarbeiten kann:

public class CatchTerm { 
    public static void main(String[] args) throws Exception { 
    Signal.handle(new Signal("TERM"), new SignalHandler() { 
     public void handle(Signal sig) { 
     //handle sigterm such as System.exit(1) 

     } 
    }); 
    Thread.sleep(86400000); 
    } 
} 

Der Vollständigkeit halber sind hier die common signals

| Signal | ID | Action | Description   | Java 
| ---  | --- | ---  | ---     | --- 
| SIGHUP | 1 | Terminate | Hangup    | The application should reload any config    
| SIGINT | 2 | Terminate | Ctrl-C    | Keyboard interrupt, start clean shutdown 
| SIGQUIT | 3 | Terminate | Terminal quit signal | JVM traps and issues a Thread dump  
| SIGABRT | 6 | Terminate | Process abort signal | Do not handle, quit immediately    
| SIGKILL | 9 | Terminate | Kill (forced)  | Cannot be trapped      
| SIGTERM | 15 | Terminate | Termination signal. | Quit quickly, safe but fast     

Für anspruchsvollere Prozessauswahl sehen killall und pkill:

+0

' SIGKILL' ('kill -9 ...') wird normalerweise nicht empfohlen, da dies nicht möglich ist vom Prozess erfasst werden, und keine Aufräumarbeiten können durchgeführt werden. – andlrc

+0

Es ist seltsam. Ich löschte die SH-Datei und erstellte sie erneut mit demselben Skript und es funktionierte. Jetzt habe ich eine Frage, da dieses Skript nur eine PID für den JVM erfasst, aber nach dem Töten einer PID wird eine andere PID generiert. Wie man dieses existierende Skript modifiziert, um alle generierten PIDs zu töten, bis alle getötet werden? – RishuA

+0

@RishuA 'killall JVM'? – andlrc