Bash Shell脚本无法终止进程

Bash Shell脚本无法终止进程,bash,shell,unix,process,aix,Bash,Shell,Unix,Process,Aix,我正在使用下面的脚本来查找和终止进程,但不知何故它不起作用。 如果有任何缺陷,请帮助编辑此文件。我在变灰。使用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" f

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

在Unix和类似Unix的操作系统中,kill是用于 向进程发送信号。默认情况下,发送的消息是 终止信号,请求进程退出。但是杀戮是 有点用词不当;发送的信号可能与此无关 进程终止

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

kill -9 $PID
或者,如果您特别小心,或者需要系统正常关闭,那么我建议您使用SIGINT,因为它与键盘上的Ctrl-C相同。所以

kill -2 $PID
我担心Java应用程序依赖于关闭挂钩中的良好行为。要确保应用程序正确处理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);
  }
}
为了完整起见,以下是


有关更高级的流程选择,请参见和:

如果
更好地写成
如果[[“x”!=“x$PID”]
,这将确保
=用于字符串比较(作为奖励,它还确保在不同的shell上正确处理空的
grep
查询)。代码看起来基本上是正确的-您可以详细说明“shomehow not working”的意思,但我们假设该过程在终止后仍然有效。如果尼尔·埃利斯的答案对你没有帮助,你就必须解释更多当从ps输出中对修复字符串进行grepping时,我所做的工作类似于
ps-eaf | grep'[J]VM'
。。这不需要
grep-vgrep
,因为grep命令与regex
SIGKILL
kill-9…
)不匹配,通常不建议使用,因为它无法被进程捕获,也无法进行清理。这很奇怪。我删除了sh文件,并用相同的脚本再次创建了它,它成功了。现在我有一个问题,因为这个脚本将只捕获jvm的一个pid,但是在杀死一个pid之后,另一个pid正在生成。如何修改此现有脚本以杀死所有泛型pid直到全部被杀死?@RishuA
killall JVM
?当然,但是大多数Java进程的信号处理都很差。在使用Java 15年之后,我还没有损坏任何东西,我见过的大多数Java生产环境也使用-9。这与其说是一个实际的风险,不如说是一个“正确性”问题。要成为一个好公民,你可以使用SIGINT或:-SIGINT,停顿,SIGKILL.@Rishua
| 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