应用程序(尤其是大型 Java 和 C++ 应用程序)通常会在 中显示为多行htop
,每行都有单独的 PID 和单独的优先级。此外,应用程序可以生成许多子进程(如 中所示aptitude update
),因此我需要同时影响父进程(以使新子进程具有新优先级)和子进程(以立即产生效果,而不是在子进程终止后)
如何将“renice”或“ionice”或“schedtool”应用于已启动的大型应用程序?
答案1
1)获取最顶层进程的PID,并记住它。
2)获取所有具有已记住 PID 的 PPID 的进程,并记住它们的 PID
3)重复步骤2,直到没有新的PID。
4)对于每个 PID,将命令应用于该进程。
用你喜欢的语言来说应该不会太难。
答案2
我没有一个完全可靠的解决方案,但在许多情况下,目标进程集将是一个进程组。如果$parent
是父进程的 pid,则以下命令列出组中进程的 pid:
ps -eo pgrp:1=,pid:1= |sed -n "s/^$parent //p"
答案3
我知道这有点老了,但是因为这是我在搜索同样的东西时出现的结果,所以我想我会发布我的解决方案(也发布在这个要点中以便我更新它)
#!/usr/bin/env bash
# This can be run simply by passing it the outputs from pgrep:
# my_renice $(pgrep application)
#
# You may also want to use pgrep to find more complex
# processes based on arguments
# my_renice $(pgrep -f "bash.*$name")
function my_renice(){
newnice=10
pid=$1
# Return if pid not found
if [ -z $pid ]; then return; fi
# Renice pid right away in case we spawn more children
renice $newnice $pid
# Find children pids
children=$(pgrep -d ' ' -P $pid)
# Loop through children
for i in $children; do my_renice $i; done
}
答案4
sudo renice -n num $(pidof processname)