web-dev-qa-db-fra.com

Comment changer la gentillesse du processus par son nom

Le processus Java tue mon ordinateur (Intel i3, 8 Go de RAM). Il prend en charge tout le processeur et le système commence à se bloquer. J'essayais de changer les processus niceness de Java, mais je dois le contrôler pour toujours et ce n'est pas toujours possible. Donc pour commencer, j'ai essayé de construire une commande pour changer le processus niceness par son nom. Fini avec quelque chose comme ça:

ps ax -o pid,comm | grep Java | awk '{print $1}' | tr "\n" " " | renice -n 5 -p

Mais on dirait que ça ne marche pas. Et je ne sais pas où aller ensuite. Script Bash peut-être? Exécutez-le par cron ou par watch à chaque x fois? Ou y a-t-il un meilleur moyen?

6

Si vous n'avez qu'une seule instance Java en cours d'exécution, simplement:

renice -n 5 -p $(pgrep ^Java$)
  • $(pgrep ^Java$): substitution de commande; bash remplace ceci par la sortie de pgrep ^Java$; pgrep ^Java$ renvoie la liste des PID des processus dont le nom correspond à l'expression régulière ^Java$, qui correspond à tous les processus dont le nom est exactement Java.

Si vous avez plusieurs instances Java en cours d'exécution:

for p in $(pgrep ^Java$); do renice -n 5 -p $p; done
  • for p in $(pgrep ^Java$); do renice -n 5 -p $p; done: presque les mêmes que ci-dessus; $(pgrep ^Java$) est une substitution de commande; bash remplace ceci par la sortie de pgrep ^Java$; pgrep ^Java$ renvoie la liste des PID des processus dont le nom correspond à l'expression régulière ^Java$, qui correspond à tous les processus dont le nom est exactement Java; ceci est développé dans la boucle for, qui assigne une nouvelle ligne de la sortie de pgrep ^Java$ à la variable $p et exécute renice -n 5 -p $p à chaque itération jusqu'à la sortie de pgrep ^Java$ est consommé
8
kos

Essaye ça:

pgrep Java | xargs -n 1 echo renice -n 5 -p

Si la sortie est satisfaisante, supprimez echo.

5
Cyrus

Après tout, c'était un problème de mémoire. Je n'ai pas défini de mémoire maximale pour Jetty, elle a donc essayé d'allouer 1/4 de la mémoire. J'ai aussi trouvé la solution finale à de tels problèmes ici:

tueur de MOO ne fonctionne pas?

0

Le moyen le plus simple que j'ai trouvé consiste à utiliser la commande pidof:

renice <new niceness> -p $(pidof <process name>)

trouvé à partir de: http://www.commandlinefu.com/commands/view/4614/renice-by-name

Pour votre situation, mettez probablement cette commande dans crontab -e (en tant que root) avec la période de votre choix (par exemple toutes les 30 minutes). Il semble que vous deviez trouver la cause première de vos nouveaux processus Java qui monopolisent les ressources et voir si vous pouvez résoudre/empêcher cela.

0
pd12