我如何终止早于“t”的进程?

我如何终止早于“t”的进程?

首先,是的,我见过这个问题:

查找(并终止)旧进程

那里的答案是错误的,没有用。我已投票并发表了相应的评论。

我想要终止的进程如下所示ps aux | grep page.py

apache 424 0.0 0.1 6996 4564 ? S 07:02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
apache 2686 0.0 0.1 7000 3460 ? S 9 月 10 日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
apache 2926 0.0 0.0 6996 1404 ? S 9月2日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
apache 7398 0.0 0.0 6996 1400 ? S 9月1日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
apache 9423 0.0 0.1 6996 3824 ? S 9 月 10 日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
apache 11022 0.0 0.0 7004 1400 ? S 9月1日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
apache 15343 0.0 0.1 7004 3788 ? S 9月9日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
apache 15364 0.0 0.1 7004 3792 ? S 9月9日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
apache 15397 0.0 0.1 6996 3788 ? S 9月9日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
apache 16817 0.0 0.1 7000 3788 ? S 9月9日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
apache 17590 0.0 0.0 7000 1432 ? S 9月7日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
apache 24448 0.0 0.0 7000 1432 ? S 9月7日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
apache 30361 0.0 0.1 6996 3776 ? S 9月9日 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py

我正在寻求设置一个简单的每日 cron,它可以查找并终止任何page.py超过一小时的进程。

上述问题的答案不起作用,因为它不匹配时间范围,它只匹配从 7 天到 7 天 23 小时 59 分 59 秒运行的进程。我不想杀死运行了 1-2 小时的进程,而是想杀死任何东西比...更棒1小时。

对上述问题的另一个答案是使用find不起作用,至少在 Gentoo 或 CentOS 5.4 上不起作用,它要么发出警告,要么如果遵循所述警告的建议则不返回任何内容。

答案1

GNU Killall 可以使用进程名称来杀死超过指定年龄的进程。

if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h page.py;fi

答案2

find 并不总是有效,并非每个系统都有可用的 etimes,并且它可能是我的正则表达式新手状态,但我不认为你需要更多的东西:

ps -eo pid,etimes,comm,user,tty | awk '{if ($4 ~ /builder/ && $5 ~ /pts/ && $2>600) print $1}'
  • 列出所有进程并提供列 PID、ELAPSED(etimes = 秒)、COMMAND、USER、TT(感谢@ahoffman)
  • 使用 awk 打印 PID,其中第 4 列 ($4,USER) 包含文本“builder”,第 5 列 ($5,TT) 包含文本“pts”,并且 ELAPSED 列的值大于 600 秒(感谢@amtd)

然后您可以通过管道将其杀死或执行任何您需要的操作。

答案3

感谢克里斯托弗的回答,我能够将其调整为以下内容:

find /proc -maxdepth 1 -user apache -type d -mmin +60 -exec basename {} \; \
| xargs ps | grep page.py | awk '{ print $1 }' | sudo xargs kill

-mmin是我缺少的查找命令。

答案4

我认为您可以修改一些先前的答案以满足您的需求。即:

对于文件中的数据(查找.-maxdepth 1-user processuser-type d-mmin +60)
  do kill -9 $(basename $FILE) # 我无法让 basename 与 find 的 exec 一起工作。如果你知道如何做,请告诉我!
完毕

或者

ps -eo pid,etime,comm | awk'$2!~/^..:..$/ && $3~/page\.py/ { print $1}'| kill -9

我认为第二种方法可能最适合您的需求。 find 版本最终会删除该用户的其他进程


--Christopher Karel

相关内容