我有一个要杀死的进程,然后重新启动服务。有人编写了一段代码,通过编写以下脚本来终止该过程
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甚至会列出该进程,因为它已被标记为杀死?
谢谢!
答案 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
信号,进程可以捕获该信号以触发正常关闭,关闭管道,套接字和文件,清理临时空间等,因此非常有用它应该给一些时间。 -9
是kill
,无法捕获。这是大锤子,用于压缩行为异常的作业,应保留用于这些情况。
您完全正确,这毫无意义。如果您这么快要使用-9
,不妨跳过粗心大意的尝试,而只需删除-15
。