2.9. コントロールグループ内のプロセスの開始

重要

サブシステムによっては、それらのサブシステムのいずれかを使用する cgroup にタスクを移動できる前に設定しておく必要のある必須パラメーターがあります。たとえば、cpuset サブシステムを使用する cgroup にタスクを移動する前には、その cgroup に対して、cpuset.cpuscpuset.mems のパラメーターを定義する必要があります。
このセクション内の例は、コマンド用の正しい構文を示していますが、これは例の中で使用されているコントローラー用に関連した 必須パラメーターを設定しているシステム上でのみ機能します。関連したコントローラーをまだ設定していない場合は、このセクションから サンプルコマンドを直接コピーしても自分のシステム上で機能させることは期待できません。
特定のサブシステムでそのパラメーターが必須であるかについては、3章サブシステムと調整可能なパラメーター を参照してください。
cgexec コマンドを実行して、cgroup 内のプロセスを開始することもできます。たとえば、 以下のコマンドは、そのグループに課せられた制限にしたがって、group1 cgroup 内で lynx Web ブラウザーを起動します。
~]# cgexec -g cpu:group1 lynx http://www.redhat.com
cgexec の構文は以下のとおりです。
cgexec -g subsystems:path_to_cgroup command arguments
ここで、
  • subsystems は、コンマ区切りのサブシステム一覧、または、利用可能なすべてのサブシステムに関連付けられた階層内のプロセスを起動するための * とします。「パラメーターのセッティング」 でも説明しているように、同じ名前の cgroup が複数の階層に存在する場合には、-g オプションを指定すると、それらの各グループ内にプロセスが作成される点に注意してください。ここで指定するサブシステムの各階層内に cgroup が存在していることを確認してください。
  • path_to_cgroup は、階層に対して相対的な cgroup へのパスです。
  • command は実行するコマンドです。
  • arguments はそのコマンドの引数です。
command の前に -- sticky オプションを追加すると、同じ cgroup の子プロセスを維持することもできます。このオプションを設定しないで cgred が稼働すると、子プロセスは /etc/cgrules.conf にあるセッティングに基づいて cgroup に割り当てられます。しかし、プロセス自体はそれを開始した cgroup 内に残ります。

その他の方法

新たなプロセスを開始すると、そのプロセスは、親プロセスのグループを継承します。このため、特定の cgroup でプロセスを開始するもう一つの方法として、シェルプロセスをそのグループに移動し (「コントロールグループへのプロセス移動」 を参照)、そのシェルからプロセスを起動することができます。以下はその例です。
~]# echo $$ > /cgroup/lab1/group1/tasks
~]# lynx
lynx を終了したあとには、既存のシェルは依然として group1 cgroup にあることに注意してください。したがって、より適切な方法は以下のようになります。
~]# sh -c "echo \$$ > /cgroup/lab1/group1/tasks && lynx"

2.9.1. コントロールグループ内のサービスの開始

cgroup 内の特定のサービスを起動することができます。cgroup 内で起動できるサービスは、以下の条件を満たしている必要があります。
  • /etc/sysconfig/servicename ファイルを使用する
  • サービスを起動するのに /etc/init.d/functionsdaemon() 関数を使用する
cgroup 内で条件に適合したサービスを開始するには、/etc/sysconfig 内でそのサービスのファイルを編集して、 CGROUP_DAEMON="subsystem:control_group" の 形式でエントリを追加します。ここで、subsystem は特定の階層に関連付けられたサブシステムであり、 control_group はその階層内の cgroup です。以下はその例です。
CGROUP_DAEMON="cpuset:daemons/sql"