Centos 7 - Pythonスクリプトで生成されたすべてのスレッドを拒否します。

Centos 7 - 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」値が表示されます。

「サブ」プロセスはすべて標準の良好な値を表示します(htopのF7キーを使用して手動で変更できます)。

こことオンラインでいくつかの同様の質問を見つけて、提案されたソリューションを試しましたが、Centos 7では動作しないようです。

誰もが親と子のプロセスを同時に再開できるように、上記のコマンドを変更する方法について正しい方向を教えてください。または、使用する必要があるより良い解決策がある場合は、喜んで試してみましょう。 。

***このスクリプトはCentos 7ホストのCentos 7 Dockerコンテナで実行されます。 Docker の権限の問題により、コンテナで目的の値でスクリプトを起動できないため、ホスト コンピュータでスクリプト プロセスを再起動し、上記のプロセスを使用してこれを行うことができます。

答え1

最も簡単な方法は、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)

答え2

この質問にコメントしたり回答したことのおかげで、次のコマンドを使用して必要なタスクを実行できました。

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)}'

関連情報