
Я написал скрипт bash, который на 100% правильный согласно https://www.shellcheck.net/#
. Код должен renice, затем cpulimit любые нужные приложения и их относительные pid.
#!/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
Проблема:
Вывод показывает, что команда renice отклоняет значения переменной «$pid»:
+ 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
Прогресс
Решение, кажется, такоеиспользоватьнеправильныйсценарий
Я изменился renice -n 19 -p "$pid" && cpulimit -p "$pid" -l 20
на renice -n 19 -p $pid && cpulimit -p $pid -l 20
И теперь вывод показывает, что все работает так, как задумано:
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
Тем временем https://www.shellcheck.net/#
кричит во весь голос
$ 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
Есть идеи, почему кавычки у переменных вызвали эту проблему?
решение1
shellcheck не знает, что выимел в виду, поэтому его общий совет "Двойные кавычки для предотвращения разделения слов" на самом деле работает против вас. Вывод pgrep "$process_name"
возвращает список PID, разделенных пробелами, которыйпотребностибыть разделенным на слова при присвоении его массиву, но поскольку вы заключили значение в двойные кавычки во время присвоения, оно всегда остается одной строкой.