Linux bash脚本在x个时间后杀死一个进程(不是由我启动的)

时间:2015-11-19 14:16:05

标签: linux bash

我对Linux bash缺乏经验。话虽这么说,我有一台运行COTS应用服务器的CentOS7机器。此应用程序服务器运行有时挂起的其他进程。由于我无法控制这些过程的开始,我正在寻找一个每2分钟运行一次的脚本,这个脚本会杀死名称" spicer"已运行超过10分钟。我环顾四周,只能找到由我运营和拥有的流程的答案。

我使用命令ps -eo pid, command,etime | grep spicer来获取所有spicer进程。此命令的输出如下所示:

18216 spicer -l/opt/otmm-10.5/Spi       14:20
18415 spicer -l/opt/otmm-10.5/Spi       11:49
etc...
18588 grep --color=auto spicer

我不知道是否有办法直接用bash解析这个问题。我在其他Linux工具中也一点也不精通。我知道awk(或gawk)可能会有所帮助。

修改

我无法控制流程正在处理的数据。

2 个答案:

答案 0 :(得分:3)

如何包装spicer的可执行文件并使用timeout命令启动它?我们假设它已安装在/usr/bin/spicer中。然后发出:

cp /usr/bin/spicer{,.orig}
echo '#!/bin/bash' > /usr/bin/spicer
echo 'timeout 10m spicer.orig "$@"' >> /usr/bin/spicer

另一种方法是在/etc/cron.d/kill_spicer中创建一个cronjob定义。像这样:

* * * * * root kill $(ps --no-headers -C spicer -o pid,etimes | awk '$2>=600{print $1}')

cronjob会被严格执行并使用ps获取运行时间超过10分钟的spicer进程列表,并将它们传递给kill

如果流程暂停,您甚至可能需要kill -9

答案 1 :(得分:0)

您可以使用-C的{​​{1}}选项按名称选择流程。

ps

如果间距一致,则可以使用ps --no-headers -C spicer -o pid,etime 过滤结果。在我的系统上,cut字段占用8个字符,因此我使用

pid

如果间距不一致(但如果是这样,你使用了什么样的混乱kill $(ps --no-headers -C spicer -o pid,etime | cut -c-8) ?:- P),你可以使用ps代替awk { print $1 }