Shell脚本无法杀死进程

时间:2016-05-31 19:41:14

标签: bash shell unix process aix

我使用下面的脚本来查找并杀死进程,但它不知何故无法正常工作。 如果有任何缺陷,请帮助编辑这个。我在忙着JVM。使用AIX机器。

    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

1 个答案:

答案 0 :(得分:2)

来自Wikipedia entry

  

在Unix和类Unix操作系统中,kill是一个常用的命令   向进程发送信号。默认情况下,发送的消息是   终止信号,请求进程退出。但杀人是   一种用词不当的东西;发送的信号可能与之无关   进程杀戮。

所以默认情况下kill发送SIGTERM(相当于kill -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