tracker-miner-f, tracker-store, tracker-extract et dropbox sont en train de tuer mon processeur, ils le font fonctionner à plus de 100%, surchauffant mon ordinateur portable.
J'ai installé CPULIMIT et cela fonctionne très bien en limitant ces processus, cependant, je ne peux pas le faire démarrer automatiquement.
J'ai suivi this mais cela ne fonctionne pas, le démon démarre mais je pense qu'il y a une erreur dans la création du script et cela ne limite en réalité aucun processus.
Existe-t-il un moyen de réduire l'utilisation de l'unité centrale de traitement sans avoir à le faire manuellement via un terminal chaque fois que je démarre une nouvelle session?
Ubuntu 14.04
Un script que j'ai trouvé ci-dessous ne s'exécute que partiellement et ne détecte pas correctement le PID.
Si quelqu'un a une meilleure connaissance que moi, pourriez-vous vérifier la ligne:
NEW_PIDS_COMMAND="top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
Est-ce correct?
#!/bin/bash
# ==============================================================
# CPU limit daemon - set PID's max. percentage CPU consumptions
# ==============================================================
# Variables
CPU_LIMIT=40 # Maximum percentage CPU consumption by each PID
DAEMON_INTERVAL=3 # Daemon check interval in seconds
BLACK_PROCESSES_LIST="dropbox" # Limit only processes defined in this variable. If variable is empty (default) all violating processes are limited.
WHITE_PROCESSES_LIST= # Limit all processes except processes defined in this variable. If variable is empty (default) all violating processes are limited.
#PID Variables
NEW_PIDS_COMMAND=
NEW_PIDS=
LIMITED_PIDS=
QUEUE_PIDS=
# Check if both of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST are defined.
if [[ -n "$BLACK_PROCESSES_LIST" && -n "$WHITE_PROCESSES_LIST" ]]
then
# If both variables are defined then error is produced.
echo "At least one or both of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST must be empty."
exit 1
# If Black_Processes_List is defined
Elif [[ -n "$BLACK_PROCESSES_LIST" ]]
then
# Set NEW_PIDS_COMMAND variable to below command
NEW_PIDS_COMMAND="top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
# If White_Processes_List is defined
Elif [[ -n "$WHITE_PROCESSES_LIST" ]]
then
# Set NEW_PIDS_COMMAND variable to below command
NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6' | grep -E -v '$WHITE_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
else
NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6 && \$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
fi
# Search and limit violating PIDs
while sleep $DAEMON_INTERVAL
do
NEW_PIDS=$(eval "$NEW_PIDS_COMMAND") # Violating PIDs
LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}') # Already limited PIDs
QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$') # PIDs in queue
for i in $QUEUE_PIDS
do
cpulimit -p $i -l $CPU_LIMIT -z & # Limit new violating processes
done
done
Je veux seulement lister des applications spécifiques de la liste noire, donc j'ai changé pour ceci:
#!/bin/bash
# CPU limit of a process
#
# Variables
CPU_LIMIT=50 # Maximum percentage CPU consumption by each PID
# NOTE: If your machine has one processor you can limit the percentage from 0% to 100%, which means that if you set for example 50%, your process cannot use more than 500 ms of cpu time for each second. But if your machine has four processors, percentage may vary from 0% to 400%, so setting the limit to 200% means to use no more than half of the available power.
DAEMON_INTERVAL=3 # Daemon check interval in seconds
PROCESS_1="" # Processes to be limited. If variable is empty (default) all violating processes are limited.
if [ -n "$PROCESS_1" ] # Process_1 entered
then
PID_1="pidof $PROCESS_1" # Set NEW_PIDS_COMMAND variable to below command
echo "Limit Process of: $PROCESS_1"
cpulimit --pid "$PID_1" -b -l "$CPU_LIMIT" # Run cpulimit with selected paramters
else
echo "All Processes limited to: $CPU_LIMIT"
PID_1="top -b -n1 -c | gawk 'NR>6 && \$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT" # Set global CPU limit
fi
# Search and limit violating PIDs
while sleep $DAEMON_INTERVAL
do
NEW_PIDS=$(eval "$PID_1") # Violating PIDs
LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}') # Already limited PIDs
QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$') # PIDs in queue
for i in $QUEUE_PIDS
do
cpulimit -p $i -l $CPU_LIMIT -z & # Limit new violating processes
done
done
Cela fonctionne, mais comment puis-je limiter plusieurs processus? Pour le moment, c'est l'un ou tous ... Merci
Voici ce que j'ai fait pour résoudre mon problème:
Sudo apt-get install cpulimit ; Sudo apt-get install gawk ; Sudo apt-get install top
Ensuite, j'ai modifié un script en fonction de:
#!/bin/bash
# CPU limit of a process
#
# Variables
# NOTE: If your machine has one processor you can limit the percentage from 0% to 100%, which means that if you set for example 50%, your process cannot use more than 500 ms of cpu time for each second. But if your machine has four processors, percentage may vary from 0% to 400%, so setting the limit to 200% means to use no more than half of the available power.
CPU_LIMIT_1=50 # Maximum percentage CPU consumption by PROCESS_1
CPU_LIMIT_2=55 # Maximum percentage CPU consumption by PROCESS_2
CPU_LIMIT_3=60 # Maximum percentage CPU consumption by PROCESS_3
CPU_LIMIT_4=40 # Maximum percentage CPU consumption by PROCESS_4
PROCESS_1="dropbox" # Process 1 to be limited. If variable 1 is empty (default) all violating processes are limited.
PROCESS_2="tracker-miner-f" # Process 2 to be limited
PROCESS_3="tracker-store" # Process 3 to be limited
PROCESS_4="tracker-extract" # Process 4 to be limited
PROCESS_5="chrome" # Process 5 to be limited
gnome-terminal -x top
if [ -n "$PROCESS_1" ] || [ -n "$PROCESS_2" ] || [ -n "$PROCESS_3" ] || [ -n "$PROCESS_4" ] || [ -n "$PROCESS_5" ] ; then
while true;
do
echo "Limit the Process of: $PROCESS_1 to $CPU_LIMIT_1"
cpulimit --exe "$PROCESS_1" -b -l "$CPU_LIMIT_1"
sleep 3
echo "Limit the Process of: $PROCESS_2 to $CPU_LIMIT_1"
cpulimit --exe "$PROCESS_2" -b -l "$CPU_LIMIT_1"
sleep 3
echo "Limit the Process of: $PROCESS_3 to $CPU_LIMIT_1"
cpulimit --exe "$PROCESS_3" -b -l "$CPU_LIMIT_1"
sleep 3
echo "Limit the Process of: $PROCESS_4 to $CPU_LIMIT_1"
cpulimit --exe "$PROCESS_4" -b -l "$CPU_LIMIT_1"
sleep 3
echo "Limit the Process of: $PROCESS_5 to $CPU_LIMIT_3"
cpulimit --exe "$PROCESS_5" -b -l "$CPU_LIMIT_4"
sleep 60
done
else
echo "Process fields empty"
fi
exit 1
Créé un dossier dans mon menu d'accueil appelé Démarrer et y a déplacé le script.
Je veux l'exécuter quand je voulais, j'ai donc créé un lanceur en utilisant 'menulibre' avec l'option d'exécution en terminal.
Il y a peut-être un meilleur moyen, mais pour l'instant cela fonctionne ... toutes les solutions meilleures sont les bienvenues!
Merci
Aussi ceci pour restreindre un processus individuel ou global:
#!/bin/bash
# CPU limit of a process of one application or set global limit
#
#
DAEMON_INTERVAL=3 # Daemon check interval in seconds
gnome-terminal -x top
read -p "Do you want to set global CPU limitations y or n : " y
if test "$y" = "y" ; then
read -p "Enter Global CPU limit :" CPU_LIMIT_ALL
echo $'\nAll Processes shall be limited to:' $CPU_LIMIT_ALL
while true
do
PID_1="top -b -n1 -c | awk 'NR>6 && \$9>CPU_LIMIT_ALL {print \$1}' CPU_LIMIT_ALL=$CPU_LIMIT_ALL" # Set global CPU limit reads TOP list
NEW_PIDS=$(eval "$PID_1") # Violating PIDs
LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}')
# Already limited PIDs
QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$') # PIDs in queue
for i in $QUEUE_PIDS
do
cpulimit -p "$i" -l "$CPU_LIMIT_ALL" -z & # Limit new violating processe
done
done
Elif test "$y" = "n" ; then
read -p "Enter process to be restricted or press enter :" r
read -p "Enter value of CPU limit or press enter :" l
while true
do
echo $'\nProcess Entry Found'
echo $'CPU Entry Found\n'
echo "Limit the Process of: $r to $l"
cpulimit --exe "$r" -b -l "$l" -z & # Set CPU limit for process
sleep 60
done
else
echo "No input found"
exit 1
fi
Enregistrer en tant que .sh puis rendre exécutable et exécuter tutorial
Si nécessaire, vous pouvez également exécuter les scripts en tant que root pour restreindre également tous les processus du système.
Sudo/chemin/vers/script /
Je me rends compte que ce fil est un peu vieux; Cependant, il existe un moyen beaucoup plus facile d’atteindre votre objectif déclaré. En utilisant les processus et les limites que vous semblez souhaiter, vous pouvez simplement créer un script Shell tel que:
#!/bin/bash
#Set this variable to the number of cores in your processor. This example is for an 8-core CPU. The reason that the number of cores is important is that you need to take it into consideration when setting cpulimit's -l option. This is explained on the cpulimit project page (see http://cpulimit.sourceforge.net/): "If your machine has one processor you can limit the percentage from 0% to 100%, which means that if you set for example 50%, your process cannot use more than 500 ms of cpu time for each second. But if your machine has four processors, percentage may vary from 0% to 400%, so setting the limit to 200% means to use no more than half of the available power."
NUM_CPU_CORES=8 #Change this number to reflect the number of cores in your processor.
cpulimit -e "dropbox" -l $((50 * $NUM_CPU_CORES))& #Limit "dropbox" process to 50% CPU usage.
cpulimit -e "tracker-miner-f" -l $((50 * $NUM_CPU_CORES))& #Limit "tracker-miner-f" process to 50% CPU usage.
cpulimit -e "tracker-store" -l $((50 * $NUM_CPU_CORES))& #Limit "tracker-store" process to 50% CPU usage.
cpulimit -e "tracker-extract" -l $((50 * $NUM_CPU_CORES))& #Limit "tracker-extract" process to 50% CPU usage.
cpulimit -e "chrome" -l $((40 * $NUM_CPU_CORES))& #Limit "chrome" process to 40% CPU usage.
Rendez le script ci-dessus exécutable et configurez-le pour qu'il s'exécute automatiquement comme vous l'avez fait avec vos autres scripts (éliminez les autres scripts). En effet, cpulimit restera en arrière-plan et surveillera les processus spécifiés et, dès que l'un d'entre eux sera démarré, cpulimit prendra le contrôle et appliquera la limite spécifiée. Lorsqu'un processus spécifié meurt ou est tué, cpulimit surveillera sa réactivation et le processus se répète.
Si vous souhaitez démarrer le programme automatiquement au démarrage, vous pouvez l'ajouter à vos applications de démarrage. Voir la réponse suivante pour plus d'informations.
Comment puis-je démarrer les applications automatiquement lors de la connexion?