是什么导致“ kill -9”有时无法按预期工作?

时间:2019-05-04 05:38:12

标签: unix sh kill

我创建了一个bash脚本来杀死运行关闭脚本后仍存活的某些进程。

#!/bin/sh
echo "Alive processes on" `date` ":" > $LOG_DIR/roguePs.out
ps auxww | grep 'fr_home' | grep -v 'grep' | grep -v 'stopAll.sh' >> $LOG_DIR/roguePs.out
kill -9 $(ps axww | grep 'fr_home' | grep -v 'grep' | grep -v 'stopAll.sh' | cut -d " " -f 2)
sleep 10
echo "Alive processes on" `date` ":" >> $LOG_DIR/roguePs.out
ps auxww | grep 'fr_home' | grep -v 'grep' | grep -v 'stopAll.sh' >> $LOG_DIR/roguePs.out

简而言之,上面的脚本:

  • 列出所有包含字符串“ fr_home”的进程,但不包括列出进程和脚本本身的文件(stopAll.sh)
  • 杀死所有找到的进程
  • 列出杀死后仍保留的进程

因此,该脚本使用的是“ kill -9”,有时可以成功杀死所有内容,但是在某些情况下,一个进程仍然有效。

输出文件显示如下内容:

Alive processes on Sat May 4 12:54:15 2019 :
...
<other processes>
...
oracle  6066  0.0  0.7705128413368 ?        O   May 01  8:03 /opt/app/oracle/product/middleware/fr_home/bin/rwserver server=RptSvr_tst1 batch=yes uid=1373394053
...
<other processes>
...
Alive processes on Sat May 4 12:54:25 2019 :
oracle  6066  0.0  0.7705264421520 ?        S   May 01  8:03 /opt/app/oracle/product/middleware/fr_home/bin/rwserver server=RptSvr_tst1 batch=yes uid=1373394053

在终止之前,进程处于“ O”状态(进程正在处理器中运行),在之后则处于“ S”(休眠)状态。从来没有处于“ Z”状态(僵尸),我认为这是“ kill -9”可能不起作用的可能原因。

此外,尽管在10秒钟后检查了进程,但我也已在数小时后手动对其进行了检查,并且该检查仍然有效。

不确定是什么原因导致无法正常执行杀死操作,还是要实施其他措施以确保一致杀死所有进程。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

好。我能够找到一个似乎对我来说很好用的命令。

因此,这里是评估的选项:

  • pgrep和pkill:首先尝试使用这些命令是有意义的,因为它们被设计为完全可以执行我要执行的操作,并且在大多数类似Unix的OS中,它们很可能会完成任务。但是,此选项对我不起作用,因为命令被截断并且pkill -f'fr_home'缺少某些进程。
  • 使用awk代替cut:ps axww抛出的输出太长,因此awk抛出了诸如“ awk:record`oracle 3553 0.1 ...'too too long”之类的错误消息。
  • 使用gawk代替cut:是的,gawk(awk的增强版本)为我工作。所以命令:
kill -9 $(ps axww | grep 'fr_home' | grep -v 'grep' | grep -v 'stopAll.sh' | cut -d " " -f 2)

成为:

kill -9 $(ps axww | grep 'fr_home' | grep -v 'grep' | grep -v 'stopAll.sh' | gawk '{print $1}')