Centos 7 - renice 由 python 脚本创建的所有线程

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”值。

“子”进程都显示标准的好值(我可以使用 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 文件...

* 更新 *

我对仅仅 renice 所有 python 进程不满意,因为如果系统上正在运行其他 python 进程,这可能会导致问题,所以我做了一些挖掘,发现这个命令只会 renice 我的 script.py 进程:

 ps --no-headers -efT | grep "python /path/script.py" | awk '$3 {system("renice -n -17 -p " $3)}'

相关内容