bash - Shell 脚本无法杀死进程

标签 bash shell unix process aix

我正在使用下面的脚本来查找并终止进程,但它不知何故不起作用。 如果有任何缺陷,请帮助编辑。我正在 grep 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

最佳答案

来自Wikipedia entry :

In Unix and Unix-like operating systems, kill is a command used to send a signal to a process. By default, the message sent is the termination signal, which requests that the process exit. But kill is something of a misnomer; the signal sent may have nothing to do with process killing.

因此,默认情况下,kill 会发送 SIGTERM(相当于kill -15),您可能需要执行 SIGKILL:

kill -9 $PID

或者,如果您格外谨慎或者需要系统正常关闭,那么我建议您使用 SIGINT,因为它与键盘上的 Ctrl-C 相同。所以

kill -2 $PID

恐怕是 Java 应用程序 doesn't always handle SIGTERM correctly它们依赖于关闭 Hook 中的良好行为。为了确保应用程序正确处理 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 :

关于bash - Shell 脚本无法杀死进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37554326/

相关文章:

linux - 在 shell 脚本中使用 $-

ruby - 我杀了 rvm 现在我有一条 bash 消息

linux - 将 CSV 中的第三个字段与 GNU Linux 中的模式文件匹配(AWK/SED/GREP)

linux - Bash:在for循环中重复数组

linux - 如果文件名不包含系统程序名称(例如 "ls"和 "grep"),我需要编写一个 shell 脚本以使文件默认可执行

unix - sed 是否阻塞?

linux - svn 提交失败 : Details Follow Directory . .. 丢失

git - 我如何知道我安装了哪些版本的 MinGW32 和 MinGW64(通过 Git Bash)?

java - 终端无法运行apktool

linux - 从文件中解析字符串并设置为变量 - Shell 脚本