所以我的目标是杀死卡住转码媒体的进程。所有进程都由runit监视,因此当进程被终止时 - 它会重新启动。
我可以通过以下方式获取进程列表:
ps aux | grep -v grep | grep ffmpeg | awk '{print $2, $3}'
我需要什么才能让任何进程被杀死,返回< 20 on $ 3 - 换句话说,进程使用的CPU少于20%?
答案 0 :(得分:1)
pgreg(1)可以为您提供一个pids列表。因此,pgrep ffmpeg
会为您提供一个运行2345 15678 9870
的进程pid列表(例如ffmpeg
)。因此ps u $(pgrep ffmpeg)
为您提供了一个进程列表。
您希望过滤运行少于20%CPU的进程。尝试
ps u $(pgrep ffmpeg) | awk '{if ($3 < 20.0) { print "kill " $2 }}'
这应该会给你几行kill 12345
。把它们送到一个shell:
ps u $(pgrep ffmpeg) | awk '{if ($3 < 20.0) { print "kill " $2 }}' | sh
您可能可以使用pkill(1)和GNU awk函数system。您可能希望ps u
跳过标题行输出,也可以将/USER/{next}
同时提供给awk
答案 1 :(得分:1)
使用awk而不使用grep的另一种方法
ps aux|awk '{if($11~ "ffmpeg" && $3<20.0){system("kill -9 "$2)}}'
($11~ "ffmpeg" && $3<20.0) # if field $11 (COMMAND column) matches "ffmpeg" and field $3 (PID column) is less than 20.0, kill PID no. which is in field $2
答案 2 :(得分:0)
另一种方法:
ps axo comm,pid,pcpu | awk '/^ffmpeg/ && $3 < 20 {print $2}' | xargs -r kill -9