2015-05-10 52 views
2

我有一組並行運行的進程。如何殺死匹配超過30分鐘的grep的進程?

偶爾有些流連長於腳本應該允許:

$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」

但我怎麼能只是殺了舊的?

+0

類似於:'ps -lf | grep「script.php」| perl -ane'($ h,$ m,$ s)= split /:/,$ F [13];殺 + 9,$ F [3]如果($ m> 30);' –

+0

..需要加小時檢查或超過一小時而小於X小時30分鐘將被錯過 –

回答

2

爲了獲得它運行的時間超過30分鐘,你 可以發出以下awk命令命名PROCESS_NAME進程列表:

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 
+0

'ps ax -ocmd,pid ,etime'只顯示進程名稱的前27個字符。如果我只根據這27個字符進行搜索,其餘的都可以使用,但我需要根據需要選擇完整的進程名稱。有小費嗎? – Ryan

+0

這給了我整個路徑,但似乎沒有基於> 30分鐘的限制。 'ps axwww -o pid,etime,command | awk'/script.php/{split($(NF),a,「:」); if(a [1]> 30)print''' – Ryan

+0

我使用'ps -oetime',它確實尊重執行時間。 – hek2mgl