linux kill命令-9 vs -15

时间:2019-04-22 15:15:37

标签: linux bash process

我有一个要杀死的进程,然后重新启动服务。有人编写了一段代码,通过编写以下脚本来终止该过程

ps -ef |grep "process_name" | awk '{print "kill -15 " $2}'> /projects/test/kill.sh
#run the kill script
/projects/test/kill.sh

然后再次

ps -ef |grep "process_name" | awk '{print "kill -9 " $2}'> /projects/test/kill.sh
#run the kill script
/projects/test/kill.sh

#finally
service restart command here     
# the problem here is that service does not restart properly sometimes, 
as it thinks that process is still running.

据我了解,kill -15会优雅地终止进程。但是马上他们也有杀死-9的能力。 因此,如果某个进程在第一个命令中被杀死,那么在同一进程上同时执行kill -9时会发生什么呢?还是ps -ef甚至会列出该进程,因为它已被标记为杀死?

谢谢!

2 个答案:

答案 0 :(得分:0)

您正确地认为kill -15是要优雅地杀死一个进程。但是,杀死一个进程是瞬间发生的。因此,上面的程序将检查pid,尝试优雅地将其杀死。.如果kill -15 失败-执行了kill -9。它知道kill -15失败的方式是grep命令。如果kill -15成功,则该pid将不再存在,从而使以下grep返回空。

实际上,kill -9仅在kill -15无法正常停止程序时运行。这种方法的问题在于,有时根据程序的不同,正常停止进程可能需要一些时间。因此,恕我直言,需要等待一段时间或sleep几秒钟,以允许kill -15尝试正常停止该过程。.最肯定的是,上述方法kill -9几乎可以总是被调用,因为脚本不允许长时间关闭进程。如果kill -15仍在处理中,kill -9将会覆盖并立即停止该过程。

答案 1 :(得分:0)

如果您可以选择重构,则可以使用/proc/$PID作为检测进程是否正在运行的更有效方法。

stopSvc() { local svc=$1
  read x pid x < <( ps -fu "$App_user" | grep -E " ($App_baseDIR/$1/|)$svc.jar$" ||: )
  local -i starting="$(date +%s)" # linux epoch timestamp in seconds
  while [[ -d "/proc/$pid" ]]
  do ps -fp "$pid"
     kill -term "$pid"
     if (( ( $(date +%s) - starting ) < 20 )) # been trying for less than 20s
     then sleep 2
          date
     else echo "$svc is hung - using a hard stop"
          kill -KILL "$pid"
          break
     fi
  done
  sleep 2
  [[ -d "/proc/$pid" ]] && return 1 || return 0  # flip the return
}

基本上,kill -15是一个term信号,进程可以捕获该信号以触发正常关闭,关闭管道,套接字和文件,清理临时空间等,因此非常有用它应该给一些时间。 -9kill,无法捕获。这是大锤子,用于压缩行为异常的作业,应保留用于这些情况。

您完全正确,这毫无意义。如果您这么快要使用-9,不妨跳过粗心大意的尝试,而只需删除-15