-
Notifications
You must be signed in to change notification settings - Fork 0
/
floc.sh
111 lines (90 loc) · 3.97 KB
/
floc.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/bin/bash
# Fonction pour surveiller les processus et collecter l'analyse d'énergie
monitor_and_collect_energy() {
local process_name="$1"
local logfile="energy_log_${process_name}.txt"
>"$logfile" # On initialise le fichier log
echo "Début de la surveillance pour : $process_name" | tee -a "$logfile"
while true; do
local pids=$(pgrep -f "$process_name")
# On vérifie si le processus est en cours d'exécution
if [ -z "$pids" ]; then
echo "$process_name n'est pas détecté. En attente..." | tee -a "$logfile"
else
for pid in $pids; do
local proc_name=$(ps -p $pid -o comm=)
# On exclu le script lui-même de l'analyse
[[ "$proc_name" == "floc.sh" ]] && continue
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Analyse : $proc_name avec PID: $pid" | tee -a "$logfile"
# On remplace la commande ci-dessous par l'appel du script d'analyse d'énergie réelle
echo "./ePerf.sh -p $pid" >> "$logfile"
# Simulation d'une commande d'analyse d'énergie
echo "Simulation d'analyse pour PID $pid complétée." | tee -a "$logfile"
done
fi
sleep 5 # Pause avant la prochaine vérification
done
}
# Fonction de détection et lancement du calcul d'énergie pour un processus et ses enfants
monitor_and_launch_calculation() {
local process_name="$1"
declare -A launched_pids # Tableau associatif pour garder une trace des PIDs déjà lancés
while true; do
# Récupère tous les PIDs pour le nom du processus donné
IFS=$'\n' read -r -d '' -a pids < <(pgrep -f "$process_name" && printf '\0')
for pid in "${pids[@]}"; do
# On exclut les PIDs sans nom de processus
local proc_name=$(ps -p $pid -o comm=)
if [[ -z "$proc_name" || "$proc_name" == "floc.sh" ]]; then
continue
fi
if [ -z "${launched_pids[$pid]}" ]; then
# On marque ce PID comme lancé
launched_pids[$pid]=1
echo "Détecté : [$proc_name] avec PID: $pid"
# On tente de lancer le calcul dans un nouveau terminal avec gestion d'erreur
gnome-terminal -- bash -c "./ePerf.sh -p $pid; exec bash" || echo "Erreur lors du lancement du terminal pour PID $pid"
fi
done
sleep 5 # Pour vérifier régulièrement pour les nouveaux processus
done
}
getInput() {
local app processName interval
# Vérifie s'il y a exactement un argument non-option (nom du processus)
if [ "$#" -eq 1 ] && [[ ! $1 =~ ^- ]]; then
monitor_and_collect_energy "$1"
exit 0
fi
# Traitement des arguments de la ligne de commande
while getopts "a:n:i:" opt; do
case ${opt} in
a) app=$OPTARG ;;
n) processName=$OPTARG ;;
i) interval=$OPTARG ;;
\? ) echo "Usage: cmd -a [NIC ou DISK ou ALL] -n [NOM DU PROCESSUS] -i [INTERVAL]"
exit 1 ;;
esac
done
if [ -z "$processName" ]; then
echo "Nom du processus non spécifié."
exit 1
fi
if [ "$app" = "NIC" ]; then
echo "Exécution de ePerfNIC pour le processus '$processName' avec un intervalle de $interval secondes."
./ePerfNIC.sh -n "$processName" -i "$interval"
elif [ "$app" = "DISK" ]; then
echo "Exécution de ePerfDISK pour le processus '$processName' avec un intervalle de $interval secondes."
./ePerfDISK.sh -n "$processName" -i "$interval"
elif [ "$app" = "ALL" ]; then
echo "Exécution de ePerfDISK et ePerfNIC pour le processus '$processName' avec un intervalle de $interval secondes."
./ePerfDISK.sh -n "$processName" -i "$interval" &
./ePerfNIC.sh -n "$processName" -i "$interval" &
else
monitor_and_launch_calculation "$processName"
fi
}
main() {
getInput "$@"
}
main "$@"