因此,我有一些在服务器上运行后台作业(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,可以使其变得更严格,但在这里,误报匹配的风险对我来说似乎很低。