setuidさ-EDプロセスに適用されていないユーザーのためのLinuxグループスケジューリング

StackOverflow https://stackoverflow.com/questions/1920952

質問

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())))

あるいは、もちろん、あなたが適切な権限を持つ、別のプロセスの優先順位を修正することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top