Я использую Centos 7 и Python 3.6.
У меня есть скрипт python, который использует многопоточность.
Я хочу изменить или изменить значение доброты для всех протекторов, которые порождает скрипт.
В настоящее время я могу изменить значение добротности родительского процесса с помощью приведенной ниже команды.
while read -r pid; do
renice -n -20 "$pid" ; done < <(ps -o pid= -C "python /path/script.py")
Затем, когда я использую htop для просмотра статуса процессов скриптов, только родительский процесс показывает обновленное или 'reniced' значение.
Все "дочерние" процессы показывают стандартное хорошее значение (я могу вручную изменить его с помощью клавиши F7 в htop)
Я нашел несколько подобных вопросов здесь и в Интернете и попробовал предложенные решения, но они, похоже, не работают на Centos 7, так что, возможно, они специфичны для данного дистрибутива.
Пожалуйста, может ли кто-нибудь указать мне правильное направление, как изменить приведенную выше команду, чтобы иметь возможность переименовывать родительский и дочерний процессы одновременно, или если есть лучшее решение, которое я должен использовать, то я буду рад попробовать его.
*** Обратите внимание, что сценарий запущен в контейнере Centos 7 docker на хосте Centos 7. Я не могу запустить скрипт в контейнере с нужным мне значением из-за проблем с разрешениями в docker, поэтому я хочу переименовать процесс скрипта на хосте, что я могу сделать с помощью приведенного выше процесса.
Самый простой способ — вызвать основной скрипт через renice.
Вы должны найти все процессы, являющиеся потомками основного процесса. Вам не нужен цикл, renice
принимает несколько аргументов:
renice -n -20 $(ps --ppid $(ps -o pid= -C "python /path/script.py") --no-headers -o pid)
или, проще для чтения:
PPID=$(ps -o pid= -C "python /path/script.py")
renice -n -20 $(ps --ppid $PPID --no-headers -o pid)
Благодаря тем, кто прокомментировал или дал ответы на этот вопрос, я смог использовать приведенную ниже команду, чтобы сделать то, что мне было нужно:
ps --no-headers -eT | grep python | awk '$2 {system("renice -n -20 -p " $2)}'
Эта команда находит все процессы Python и обновляет их.
Это быстрое и грязное решение, но оно будет делать то, что мне нужно, поскольку единственный процесс Python, работающий в системе, — это мой файл script.py...
*ОБНОВЛЕНИЕ*
Меня не устраивала простая перенастройка всех процессов Python, так как это могло вызвать проблемы, если в системе запущены другие процессы Python, поэтому я немного покопался и обнаружил, что эта команда просто переназначит мои процессы script.py:
ps --no-headers -efT | grep "python /path/script.py" | awk '$3 {system("renice -n -17 -p " $3)}'