Las aplicaciones (especialmente las grandes de Java y C++) a menudo aparecen como varias líneas en htop
, cada una tiene un PID separado y un nivel agradable separado. Además, la aplicación puede generar muchos procesos secundarios (como en aptitude update
), por lo que necesito afectar tanto al padre (para que los nuevos hijos tengan una nueva prioridad) como a los hijos (para lograr el efecto inmediatamente, no después de que el hijo termine).
¿Cómo puedo aplicar "renice" o "ionice" o "schedtool" a una aplicación grande ya lanzada?
Respuesta1
1) Obtenga el PID del proceso superior y recuérdelo.
2) Obtenga todos los procesos con PPID de un PID recordado y recuerde sus PID
3) repita el paso 2 hasta que no haya nuevos PID.
4) Para cada PID, aplique el comando a ese proceso.
No debería ser demasiado difícil en tu idioma favorito.
Respuesta2
No tengo una solución completamente sólida, pero en muchos casos el conjunto de procesos objetivo será un grupo de procesos. Si $parent
es el pid del proceso padre, el siguiente comando enumera los pid de los procesos del grupo:
ps -eo pgrp:1=,pid:1= |sed -n "s/^$parent //p"
Respuesta3
Sé que esto es un poco antiguo, pero como esto es lo que surgió cuando busqué lo mismo, pensé en publicar mi solución (También publicado en esta esencia en caso de que lo actualice.)
#!/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
}
Respuesta4
sudo renice -n num $(pidof processname)