Bash

殺死執行時間超過 20 分鐘的子作業

  • May 12, 2017

所以我有一些在伺服器上執行後台作業(resque)的程序,其中一些作業啟動了一個偶爾會卡住的子程序。我發現如果我殺死那個子程序,一切都會恢復正常。我們有另一個腳本可以殺死一個二進制程序,如果它執行很長時間,但它似乎在這裡不起作用。通常我可以這樣做:

killall --older-than 20m <process>

但這些工人似乎有點棘手。以下是它們在 ps 中的外觀:

jbsmith@server:~$ ps aux | grep resque
www-data 17652  0.0  1.8 794148 145940 ?       Sl   11:03   0:05 resque-1.26.0: Processing email since 1494525823 [Email]
www-data  1026  0.0  1.9 787712 157080 ?       Sl   10:47   0:13 resque-1.26.0: Forked 17652 at 1494525823

“在 x 處分叉 x”是子程序,也是我需要殺死的子程序。是否有一個線性命令我可以用來查找可能匹配“分叉”且超過 20 分鐘的程序並殺死它們?

一個“單行”,分成兩行以減少滾動:

ps aux | awk -v cutoff=$(( $(date +%s) - 20 * 60 ))  \
 '/resque.*Forked [0-9]+ at [0-9]+/ { if ($NF < cutoff) system("kill " $2) }'

通過使用輸出說明符 for 將輸出限制為僅 PID 和 COMM 和 ARG 欄位,然後專門匹配 COMM 和 ARGS,可以使其更緊密ps,但在這裡,誤報匹配的風險似乎很低。

引用自:https://unix.stackexchange.com/questions/364526