アプリケーション(特に大規模な Java や C++ のもの)は、 では複数の行として表示されることが多くhtop
、それぞれに個別の PID と個別の nice レベルがあります。また、アプリケーションは多数の子プロセスを生成する可能性がある( のようにaptitude update
)ため、親プロセス(新しい子プロセスに新しい優先度を持たせるため)と子プロセス(子プロセスが終了した後ではなく、すぐに効果をもたらすため)の両方に影響を与える必要があります。
すでに起動されている大きなアプリケーションに「renice」や「ionice」や「schedtool」を適用するにはどうすればよいですか?
答え1
1) 最上位プロセスの PID を取得して記憶します。
2) 記憶されたPIDのPPIDを持つすべてのプロセスを取得し、それらのPIDを記憶する
3) 新しい PID がなくなるまで手順 2 を繰り返します。
4) 各 PID に対して、そのプロセスにコマンドを適用します。
あなたの好きな言語でなら、それほど難しくないはずです。
答え2
完全に堅牢なソリューションはありませんが、多くの場合、ターゲット プロセスのセットはプロセス グループになります。 が$parent
親プロセスの pid である場合、次のコマンドはグループ内のプロセスの pid を一覧表示します。
ps -eo pgrp:1=,pid:1= |sed -n "s/^$parent //p"
答え3
これは少し古いですが、同じことを検索したときにこれが表示されたので、解決策を投稿することにしました(更新した場合に備えて、このgistにも投稿しました)
#!/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)