2016-10-15 3 views
1

sysinfo()関数は、現在Linuxシステムで実行されているプロセスの総数を表すprocsパラメータを返します。Linux上でプロセスグループ内で使用されたプロセスの数を判断するためのプログラム的な方法はありますか?

ただし、setrlimit()およびgetrlimit()関数には、プロセスが持つことができる子プロセスの数を制限するパラメータがあります。

システムがその番号を強制するためには、それは現在のプロセス数がグループであることが分かっていると思います。その番号はすぐにアクセスできますか?

+0

さてあなたは、あなたが実際にあなたが持っている成功し 'フォーク()'システムコールの数によって生成されたプロセスの数を知ることができますあなたはフォークが '0'を返すたびにそれらを数えなければなりません。あなたが成功した 'wait(2)'呼び出しの回数も考慮する場合は、作成したプロセスの総数、アクティブな数(それらを差し引いたもの)、完了したプロセスの数が得られます。 –

+0

ところで、実際にフォークしていないプロセスの数を知っていると、システムにセキュリティの問題があります。 –

答えて

1

、Linuxカーネルは(例えばfork()に)copy_process機能 http://lxr.free-electrons.com/source/kernel/fork.c?v=4.8#L1371

1371   if (atomic_read(&p->real_cred->user->processes) >= 
1372       task_rlimit(p, RLIMIT_NPROC)) { 

又はsys_execve(FS/exec.cでdo_execveat_common)中で&p->real_cred->user->processesフィールドを読み取り:

1504 if ((current->flags & PF_NPROC_EXCEEDED) && 
1505  atomic_read(&current_user()->processes) > rlimit(RLIMIT_NPROC)) { 
1506  retval = -EAGAIN; 
1507  goto out_ret; 

したがって、processesがRLIMIT_NPROCより大きい場合、関数は失敗します。このフィールドは、だから、プロセス数の会計はユーザーごとです

atomic_t processes; /* How many processes does this user have? */ 

としてsched.hstruct credreal_credでアクセス(struct user_structの一部として定義されて

フィールドの減少が失敗した場合にcopy_processである:。

1655 bad_fork_cleanup_count: 
1656 atomic_dec(&p->cred->user->processes); 

とフィールドの増分はcopy_credである:http://code.metager.de/source/xref/linux/stable/kernel/cred.c#313

313 /* 
314 * Copy credentials for the new process created by fork() 
315 * 
316 * We share if we can, but under some circumstances we have to generate a new 
317 * set. 
318 * 
319 * The new process gets the current process's subjective credentials as its 
320 * objective and subjective credentials 
321 */ 
322 int copy_creds(struct task_struct *p, unsigned long clone_flags) 

339   atomic_inc(&p->cred->user->processes); 

372 atomic_inc(&new->user->processes); 

manページは、ユーザごとの上限であることを言う:http://man7.org/linux/man-pages/man2/setrlimit.2.html

RLIMIT_NPROC 
      The maximum number of processes (or, more precisely on Linux, 
      threads) that can be created for the real user ID of the 
      calling process. Upon encountering this limit, fork(2) fails 
      with the error EAGAIN. 
+0

ああ。私はそれを正しく読まなかった。私はいつもそれが "プロセスのグループ"であり、ユーザーごとではありませんでした。それは取引を完全に変えます。 'p-> real_cred-> user-> processes'を読むための関数を提示していないので、何もないと思いますか?プロセスフィールドであればアクセスできます。 –

+1

@AlexisWilke、私は 'fs/proc'でこれを読んでいません。http://code.metager.de/source/search?q=processes&defs=&refs=&path=%2Flinux%2Fstable%2Ffs%2Fproc&hist= &type=;いいえfs/kernelも読み込みます:http://code.metager.de/source/search?q=processes&defs=&refs=&path=%2Flinux%2Fstable%2Fkernel&hist=&type=(cred.cにはありません)。/procと/ sysファイルは通常ここに実装されています。この値をどこかにエクスポートする独自のカーネルモジュールを実装しようとすることができます(カーネルとモジュールとの対話方法のリスト - http://stackoverflow.com/a/10816922/196561)。あるいは、Linuxのカーネルのメーリングリストで尋ねますか? – osgx

0

あなたの最後の声明は必ずしも真実ではないと思います。たとえば、子プロセスが独自の子プロセスを作成する場合など、グループ内にさらに多くのプロセスがある可能性があります(RLIMIT_NPROC)。これらは制限に違反していないにもかかわらず、同じグループに属しています。

ただし、procfsを読んで解析することで、情報を得ることは間違いありません。プロセスのグループを指定すると、同じグループ(pgrp行のページ)内の疑似ファイルを他の/proc/<pid>/statで検索することができます。これは実装には非効率的ですが、迷惑です。 RLIMIT_NPROC制限を強制する

+0

RLIMIT_NPROC制限を強制するため、カーネルは 'copy_process'の'&p-> real_cred-> user-> processes'フィールドを読み込みます - http://lxr.free-electrons.com/source/kernel/fork.c?v=4.8 #L1371 - これは 'atomic_t processes; \t/*このユーザーはいくつのプロセスを持っていますか? */'[sched.h]のフィールド(http://code.metager.de/source/xref/linux/stable/include/linux/sched.h#816)。したがって、プロセスカウントのアカウンティングはユーザーごとです。 – osgx

+0

明示的な 'setpgrp(2)'コールを実行すると、ライブプロセスを同じセッションIDに属する制限付きでグループ間で移動できます。これにより、プロセス階層へのグループ・リンク内のプロセス数が完全に破棄されます。 –

+0

ええ、質問に「group」という言葉を使用しましたが、実際にはosgxが指摘しているように、RLIMIT_NPROCはUnixグループではなくユーザーに適用されます。したがって、特定のユーザーに属するすべてのプロセスをチェックする必要があります。明らかに、グループと同じように、ユーザーはユーザーからユーザーに移動できますが、実際には十分な機能を備えたユーザーだけがそれを実行できます。ほとんどの人には十分な権利がありません。 'libprocps4'を使って構造内のプロセスのリストを得ることができます。 –

関連する問題