Unix 是什么原因导致的;杀死-9“;有时不按预期工作?
我创建了一个bash脚本,用来杀死一些在运行关闭脚本后仍处于活动状态的进程Unix 是什么原因导致的;杀死-9“;有时不按预期工作?,unix,sh,kill,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 -
#!/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)
- 终止找到的任何进程
- 列出终止后仍保持活动状态的进程
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
2019年5月4日星期六12:54:15的活动流程:
...
...
oracle 6066 0.0 0.7705128413368?O 5月1日8:03/opt/app/oracle/product/middleware/fr_home/bin/rwserver server=RptSvr_tst1 batch=yes uid=1373394053
...
...
2019年5月4日星期六12:54:25的实时进程:
oracle 6066 0.0 0 0.770526441520?S May 01 8:03/opt/app/oracle/product/middleware/fr_home/bin/rwserver server=RptSvr_tst1 batch=yes uid=1373394053
进程在kill之前处于“O”状态(进程在处理器中运行),在kill之后处于“S”(休眠)。从未处于“Z”状态(僵尸),我认为这可能是“kill-9”无法完成任务的原因之一
另外,尽管进程在10秒后被检查,但我也在数小时后手动检查了它,它仍然保持活动状态
不确定是什么原因导致终止不起作用,或者还不确定要实现什么以确保所有进程一致终止
如有任何建议,将不胜感激。好的。我找到了一个似乎对我有效的命令 因此,以下是评估的选项:
- pgrep和pkill:首先尝试这些命令是有意义的,因为它们的设计目的正是为了完成我所追求的任务,而且在大多数类似Unix的操作系统中,它们可能完成这项工作。但是,此选项对我不起作用,因为命令被截断,pkill-f“fr_home”缺少一些进程
- 使用awk而不是cut:ps axww引发的输出太长,因此awk引发了错误消息,如“awk:record`oracle 3553 0.1…”太长
- 使用gawk而不是cut:是的,gawk(awk的增强版)对我很有用。So命令:
kill -9 $(ps axww | grep 'fr_home' | grep -v 'grep' | grep -v 'stopAll.sh' | gawk '{print $1}')
pid是肯定的!。。。这正是正在发生的事情。。。谢谢@Aaron。ps+grep+cut只列出了具有6位pid的进程。我不使用pgrep或pkill的原因是Solaris正在截断该命令(有关此命令的详细信息,请参见此处:),而某些进程将丢失。如果我没有找到一个更高级的解决方案,我可以用'cut-d'-f3'添加第二个kill。虽然不太理想,但我认为它可以胜任。所以。。。您可以通过一个awk实例来避免所有grep:
ps axww | awk'/grep | stopAll\.sh/{next}/fr_home/{print$1}| xargs kill-9
。。。但我认为你最好调整fr_home
或任何启动它的东西,在某处记录一个pid文件,然后让你的启动/停止脚本使用它。在$中存储最近后台进程的pid的开始脚本代码>,可以保存到文件中。您的停止脚本可以通过在终止任何内容之前检查那里正在运行的内容来验证PID文件。
kill -9 $(ps axww | grep 'fr_home' | grep -v 'grep' | grep -v 'stopAll.sh' | gawk '{print $1}')