我正在运行 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)}'