终止运行时间超过 20 分钟的子作业

终止运行时间超过 20 分钟的子作业

因此,我有一些在服务器上运行后台作业(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

“Forked x at x”是子进程,也是我需要杀死的进程。是否有一个单行命令可以用来查找可能与“Forked”匹配并且超过 20 分钟的进程并杀死它们?

答案1

“一行”,分成两行以减少滚动:

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

通过使用输出说明符ps将输出限制为仅 PID、COMM 和 ARG 字段,然后专门匹配 COMM 和 ARGS,可以使其变得更严格,但在这里,误报匹配的风险对我来说似乎很低。

相关内容