Renovación de aplicaciones multiproceso complejas en Linux

Renovación de aplicaciones multiproceso complejas en Linux

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 $parentes 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)

información relacionada