Linux没有(还)遵循POSIX.1标准,它说的是一renice
对过程的影响“的过程中所有的系统范围线程”,因为根据并行线程(7)文档“线程不共用一个很好的价值。”
但是,有时,renice
与给定进程相关的“一切”可能很方便(一个示例是Apache子进程及其所有线程)。所以,
renice
所有线程都属于一个给定的进程?renice
所有子进程都属于一个给定的进程?我正在寻找一个相当简单的解决方案。
我知道流程组有时会有所帮助,但是,它们并不总是与我想做的事情相匹配:它们可以包含更广泛或不同的流程集。
使用cgroup
Managed bysystemd
可能也会有所帮助,但是即使我有兴趣了解它,我也主要是在寻找“标准”解决方案。
编辑:也man (7) pthreads
说:“一个进程中的所有线程都放在同一个线程组中;线程组的所有成员共享相同的PID”。那么,甚至renice
没有它自己的PID的东西也可能吗?
renice
我们需要获取所有待处理进程(子进程或线程组中的子进程)的PID(“正常”或“线程”)。这应该是递归的(考虑孩子的孩子)。
Anton Leontiev的答案给出了这样做的提示:文件夹中的所有文件夹名称/proc/$PID/task/
都是线程的PID,其中包含children
列出潜在子进程的文件。
但是,它缺乏递归性,因此这里有一个快速而肮脏的shell脚本来查找它们:
#!/bin/sh
[ "$#" -eq 1 -a -d "/proc/$1/task" ] || exit 1
PID_LIST=
findpids() {
for pid in /proc/$1/task/* ; do
pid="$(basename "$pid")"
PID_LIST="$PID_LIST$pid "
for cpid in $(cat /proc/$1/task/$pid/children) ; do
findpids $cpid
done
done
}
findpids $1
echo $PID_LIST
如果您要递归地处理PID 1234,那么现在您可以执行以下操作:
renice -n 15 -p $(/path/to/findchildren.sh 1234)
请注意,由于自动任务分组,尤其是在使用systemd时,如今,好的值可能在“整个系统”中不太重要。请参阅此答案以获取更多详细信息。
注意:此答案准确地解释了Linux线程。
简而言之:内核仅处理“可运行的实体”,即可以运行和调度的东西。在内核方面,这些实体称为流程。线程只是一种与另一线程共享(至少)内存空间和信号处理程序的进程。每个此类进程都有一个系统范围的唯一标识符:PID(进程ID)。
结果,您可以 renice
单独使用每个“线程”,因为它们确实具有自己的PID 1。
1查看该答案为约PID(的ProcessID)和TID差(线程ID)的详细信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句