【问题标题】:How can I kill the processes matching a grep older than 30 minutes?如何杀死匹配 grep 超过 30 分钟的进程?
【发布时间】:2015-05-10 22:07:33
【问题描述】:

我有一组并行运行的进程。

有时,有些人的停留时间超过了脚本所允许的时间:

$time_start = microtime(true)
$max_run_time = 30 * 60; // 30 minutes, measured in seconds
while ((microtime(true)-$time_start) < $max_run_time) {
    // do stuff, but quit after 30 minutes
}

我想终止该脚本中已存在超过 30 分钟的旧进程。

我怎样才能从命令行做这么多?

这是当前正在运行的进程的示例:

> ps aux | grep script.php
my_user       856 28.3  0.7 546152 234568 ?       S    11:46  88:42 php /path/to/my/script.php
my_user      4931 28.2  1.2 708176 396476 ?       R    07:03 168:06 php /path/to/my/script.php
my_user      6965 28.6  0.7 542132 230764 ?       S    11:51  88:08 php /path/to/my/script.php
my_user      8411 28.3  0.6 536944 225392 ?       S    11:47  88:27 php /path/to/my/script.php
my_user      9087 28.3  1.5 820720 509208 ?       S    06:56 171:12 php /path/to/my/script.php
my_user      9095 27.3  1.1 693496 381992 ?       S    06:56 164:59 php /path/to/my/script.php
my_user     11182 28.1  1.1 704948 393028 ?       R    06:57 169:14 php /path/to/my/script.php
my_user     12490 27.9  0.7 553700 242444 ?       S    11:35  90:32 php /path/to/my/script.php
my_user     14050 28.0  1.1 686380 374972 ?       S    06:58 168:42 php /path/to/my/script.php
my_user     14051 27.9  1.5 828872 517364 ?       S    06:58 168:14 php /path/to/my/script.php
my_user     14888 27.9  0.6 540208 228744 ?       R    11:52  85:55 php /path/to/my/script.php
my_user     16412 27.0  0.9 612436 300828 ?       S    11:48  84:01 php /path/to/my/script.php
my_user     17776 28.2  1.1 693748 382016 ?       S    06:59 169:38 php /path/to/my/script.php
my_user     21159 28.2  1.5 825944 514560 ?       R    07:00 169:02 php /path/to/my/script.php
my_user     21215 28.5  1.2 708172 396724 ?       S    07:00 171:01 php /path/to/my/script.php
my_user     23615 27.3  0.9 632712 321224 ?       S    11:24  91:36 php /path/to/my/script.php
my_user     26225 27.8  1.1 696316 384788 ?       S    07:01 166:42 php /path/to/my/script.php
my_user     31541 28.6  1.5 829628 518124 ?       S    07:02 170:46 php /path/to/my/script.php
my_user     31542 28.4  1.1 704476 393152 ?       S    07:02 170:02 php /path/to/my/script.php

我可以使用 `pkill -f "php /path/to/my/script.php" 杀死它们

但我怎么能杀死旧的呢?

【问题讨论】:

  • 类似:ps -lf | grep "script.php" | perl -ane '($h,$m,$s) = split /:/,$F[13]; kill + 9, $F[3] if ($m &gt; 30);
  • .. 需要添加小时检查,否则超过一个小时且小于 X 小时 30 分钟的将被错过

标签: php linux unix grep kill


【解决方案1】:

要获取运行时间超过 30 分钟的名为 PROCESS_NAME 的进程列表,您可以 可以发出以下awkcommand:

ps ax -ocmd,pid,etime | awk '/PROCESS_NAME/{split($(NF),a,":");if(a[1]>30)print}'

仅获取 pid 运行

ps ax -ocmd,pid,etime | awk '/PROCESS_NAME/{split($(NF),a,":");if(a[1]>30)print $(NF-1)}'

您可以将其通过管道传递给xargs kill,如下所示:

ps ax -ocmd,pid,etime | awk '/PROCESS_NAME/{split($(NF),a,":");if(a[1]>30)print $(NF-1)}' \
| xargs kill 

【讨论】:

  • ps ax -ocmd,pid,etime 仅显示进程名称的前 27 个字符。如果我只是根据这 27 个字符进行搜索,其余的都可以,但我需要根据需要选择完整的进程名称。有什么建议吗?
  • 这给了我整个路径,但似乎并没有基于> 30分钟的限制。 ps axwww -o pid,etime,command | awk '/script.php/{split($(NF),a,":");if(a[1]&gt;30)print}'
  • 我用的是ps -oetime,确实尊重执行时间。
  • 但是如果我在运行你的命令之前运行grep script.php,我会在你的命令结果中看到grep script.php,执行时间只有00:01。如果这很重要,我正在运行 Centos 6.6。
  • awk 进行过滤,而不是 ps。如果你运行我的第一个命令 - 不变 - 你不会运行少于 31 分钟的进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多