
Ich habe ein Bash-Skript geschrieben, das laut 100 % korrekt ist https://www.shellcheck.net/#
. Der Code sollte alle gewünschten Anwendungen und ihre relativen PIDs neu referenzieren und dann cpulimitieren.
#!/bin/bash
INTERVAL=10
PROCESSES_TO_WATCH=gnome-shell
set -x
while sleep $INTERVAL; do
for process_name in $PROCESSES_TO_WATCH; do
pid_list=("$(pgrep "$process_name")")
# Don't do anything if no running process found
[ ${#pid_list[@]} -le 0 ] && continue
for pid in "${pid_list[@]}"; do
renice -n 19 -p "$pid" && cpulimit -p "$pid" -l 20
done
done
done
#EOF
Problem:
Die Ausgabe zeigt, dass der Befehl „renice“ die Variablenwerte „$pid“ ablehnt:
+ sleep 10
+ for process_name in $PROCESSES_TO_WATCH
+ pid_list=("$(pgrep "$process_name")")
++ pgrep gnome-shell
+ '[' 1 -le 0 ']'
+ for pid in "${pid_list[@]}"
+ renice -n 19 -p '1797
3709
3074206'
renice: bad process ID value: 1797
3709
3074206
Fortschritt
Die Lösung scheint zu seinbenutze einfalschSkript
Ich wechselte renice -n 19 -p "$pid" && cpulimit -p "$pid" -l 20
zu renice -n 19 -p $pid && cpulimit -p $pid -l 20
Und jetzt zeigt die Ausgabe, dass es wie vorgesehen funktioniert:
root@machine# /usr/local/bin/process-leash.sh
+ sleep 10
+ for process_name in $PROCESSES_TO_WATCH
+ pid_list=("$(pgrep "$process_name")")
++ pgrep gnome-shell
+ '[' 1 -le 0 ']'
+ for pid in "${pid_list[@]}"
+ renice -n 19 -p 1797 3709 3074206
1797 (process ID) old priority 0, new priority 19
3709 (process ID) old priority 0, new priority 19
3074206 (process ID) old priority 0, new priority 19
+ cpulimit -p 1797 3709 3074206 -l 20
Process 1797 detected
Inzwischen https://www.shellcheck.net/#
schreit es sich die Seele aus dem Leib
$ shellcheck myscript
Line 14:
renice -n 19 -p $pid && cpulimit -p $pid -l 20
^-- SC2086 (info): Double quote to prevent globbing and word splitting.
^-- SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean: (apply this, apply all SC2086)
renice -n 19 -p "$pid" && cpulimit -p "$pid" -l 20
Irgendwelche Ideen, warum die Anführungszeichen bei den Variablen dieses Problem verursacht haben?
Antwort1
Shellcheck weiß nicht, was Siegemeint, daher arbeitet der allgemeine Ratschlag „Doppelte Anführungszeichen, um Worttrennung zu vermeiden“ tatsächlich gegen Sie. Die Ausgabe von pgrep "$process_name"
gibt eine durch Leerzeichen getrennte Liste von PIDs zurück, dieBedürfnissemuss bei der Zuweisung zu einem Array in Wörter aufgeteilt werden, aber da Sie den Wert bei der Zuweisung in doppelte Anführungszeichen gesetzt haben, bleibt er immer eine einzelne Zeichenfolge.