setuidさ-EDプロセスに適用されていないユーザーのためのLinuxグループスケジューリング
-
20-09-2019 - |
質問
2.6.28-11 Linuxカーネル上で、私はバイアスに異なるユーザープロセスが受け取るCPU時間の量をのsetpriorityを使用しています。ユーザー1は、Linuxののsetpriorityを使用してユーザ2のダブルCPUパワーを受け取ることになっている、私は、ユーザー2(nice値の面で高い)低い優先順位に割り当てられています。私は負荷の下でコンピュータとシェルを経由して、まったく同じプログラムを実行すると、ユーザ2の実行は、ユーザ1の二倍の時間がかかります。私は、ルートとしてプログラムを実行し、ただし、(再度、コンピュータは、同じ方法でユーザ1によって実行される正確に同じプログラムに負荷がかかっている)ユーザ2になることのsetuid、のseteuid、setgidの、setegid、およびsetgroupsをを使用、プログラムは実行に時間が正確に同じ量を取ります。ユーザー2のプロセスは、ユーザ1のより任意の少ない予定されていませんでした。どのように私はこの問題を回避することができますか?私は、プロセスが現在別のユーザーの一部であることを実現するために、スケジューラのために何かを設定する必要がありますか?
プログラムが実行されてはPythonである。
解決
右、これは、それはあなたが望むものではない場合でも、設計された動作です。あなたが正常に開始された場合は、あなたが継承されている必要がありますものと一致するために、独自の優先順位を更新することができます:
/* C */
#include <sys/resource.h>
int proc_prio = getpriority(PRIO_PROCESS, getpid()),
pgrp_prio = getpriority(PRIO_PGRP, getpgrp()),
user_prio = getpriority(PRIO_USER, getuid());
setpriority(PRIO_PROCESS, getpid(),
proc_prio < pgrp_prio ? pgrp_prio < user_prio ? user_prio
: pgrp_prio
: proc_prio < user_prio ? user_prio
: proc_prio);
# Python
import ctypes
import os
PRIO_PROCESS, PRIO_PGRP, PRIO_USER = 0, 1, 2
libc = ctypes.CDLL('libc.so.6')
libc.setpriority(PRIO_PROCESS, os.getpid(),
max(libc.getpriority(PRIO_PROCESS, os.getpid()),
libc.getpriority(PRIO_PGRP, os.getpgrp()),
libc.getpriority(PRIO_USER, os.getuid())))
あるいは、もちろん、あなたが適切な権限を持つ、別のプロセスの優先順位を修正することができます。
所属していません StackOverflow