Centos 7 - renice всех потоков, созданных скриптом python

Я использую 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, поэтому я хочу переименовать процесс скрипта на хосте, что я могу сделать с помощью приведенного выше процесса.

0
06.08.2017, 07:32
2 ответа

Самый простой способ — вызвать основной скрипт через 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)
0
28.01.2020, 05:05

Благодаря тем, кто прокомментировал или дал ответы на этот вопрос, я смог использовать приведенную ниже команду, чтобы сделать то, что мне было нужно:

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)}'
0
28.01.2020, 05:05

Теги

Похожие вопросы