2016-05-31 13 views
2

以下のスクリプトを使用してプロセスを見つけて終了させますが、何らかの理由で動作しません。 欠陥があれば編集してください。私はJVMをgrepしています。 AIXマシンを使用する。 Wikipedia entryからシェルスクリプトがプロセスを終了できない

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

'if 'は' [["x"!= "x $ PID"]] 'として書かれている方が良いでしょう。これは'!= 'が文字列の比較に使われることを保証します(ボーナスとして、 'クエリーは異なるシェルで正しく処理されます)。 – grochmal

+0

コードは基本的に正しいと思われます。「ショーウショウは機能していません」という意味を具体的に説明することはできますが、そのプロセスが殺人から生き残ったと仮定します。 Neil Ellisの答えが役に立たない場合は、もっと説明する必要があります。 - ps出力から文字列を修正するとき、私は 'ps -eaf | grepコマンドが正規表現 –

答えて

2

:UnixやUnixライクなオペレーティングシステムで

、殺すプロセスにシグナルを送る に使用されるコマンドです。デフォルトでは、送信されるメッセージは 終了シグナルで、プロセスが終了するように要求します。しかし、殺すことは なのである。送信された信号はプロセスの終了時に とは何の関係もない可能性があります。デフォルトキルによってそう

SIGTERM(-15を殺すために相当)は、おそらくSIGKILLを行う必要がありますが送信されます。

kill -9 $PID 

たり、余分な慎重になっているか、正常にシャットダウンするシステムが必要な場合SIGINTはキーボードのCtrl-Cと同じように使用することをお勧めします。だから、

kill -2 $PID 

Javaアプリケーションは、私は、彼らがシャットダウン・フックで良い行動に依存しているdoesn't always handle SIGTERM correctly怖いです。アプリが正常にSIGTERMのような信号を扱う必ず直接SIGTERM信号処理できるようにするには:ここでは完全を期すため

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); 
    } 
} 

を、より高度なプロセス選択のため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     

killallpkillを参照してくださいされています

+0

と一致しないので 'grep -v grep'を必要としないgrep '[J] VMM'' .. 'SIGKILL'(' kill -9 ... ')は通常は推奨されませんプロセスによってキャッチされ、クリーンアップは実行できません。 – andlrc

+0

その奇妙な。私はshファイルを削除し、同じスクリプトを使って再度作成した。このスクリプトはjvmのpidを1つだけキャプチャしますが、1つのpidを終了した後、他のpidが生成されているので、今私は1つの質問があります。すべての世代のpidを殺すためにこの既存のスクリプトを修正するにはどうすればすべてが殺されるのでしょうか? – RishuA

+0

@ RishuA 'killall JVM'? – andlrc

関連する問題