偶発的なCフォーク爆弾 - 死後もフォークし続けます。

偶発的なCフォーク爆弾 - 死後もフォークし続けます。

私はLinuxでCの基本を学ぶ人のためにカーネル2.6.32を実行しているCentOS 7サーバーを担当しています。残念ながら、これには以下が含まれますfork()。時には正直な事故が発生し、フォーク爆弾のようにプロセスが分岐し続けます。

htopこのようなことが最初に発生した場合は、通常、に表示されている基本プロセスを終了しますが、ps aux問題は消えないようです。htop同氏によると/sbin/init、8コアのCPUパワーをすべて使用していますが、予想された800%ではなく、約14%程度の使用量だけを示しています。リソースを使用する他のプロセスがないようです。

この問題をデバッグするのに役立つさまざまなツールを確認しましたが、execsnoop残念ながら、ツールには次のようなもの以外は何も表示されませんでした。

31252     68 /usr/libexec/abrt-hook-ccpp 11 0 31248 48676 600 1620889853 e
31262     68 /usr/libexec/abrt-hook-ccpp 11 0 31258 48676 600 1620889853 e
31266     68 /usr/libexec/abrt-hook-ccpp 11 0 31261 48676 600 1620889853 e
31281     68 /usr/libexec/abrt-hook-ccpp 11 0 31278 48676 600 1620889853 e
31300     68 /usr/libexec/abrt-hook-ccpp 11 0 31296 48676 600 1620889853 e
31303     68 /usr/libexec/abrt-hook-ccpp 11 0 31299 48676 600 1620889853 e
31319     68 /usr/libexec/abrt-hook-ccpp 11 0 31315 48676 600 1620889853 e

もう1つは、forkstat -X上記のプロセスの他の多くのインスタンスと一緒に、ブランチとシャットダウン(常に「フォーク」の数より1つの「終了」が少ない)を引き起こしたプロセスを示しています。

10:33:54 exit  14372 ncig041 ncig041      ? ⇥    11   0.003s ./712_2_Laborator9_9 1 2 3 4
10:33:54 exit  14373 rmar201 rmar201      ? ⇥   256   0.004s ./a.out aeiTou
Time     Event   PID     UID    EUID TTY     Info   Duration Process
10:33:54 fork  14374 ncig041 ncig041      ? ┬parent          ./712_2_Laborator9_9 1 2 3 4
10:33:54 fork  14376 ncig041 ncig041      ? └child           ./712_2_Laborator9_9 1 2 3 4
10:33:54 exit  14374 ncig041 ncig041      ? ⇥    11   0.004s ./712_2_Laborator9_9 1 2 3 4
10:33:54 exit  14371 rmar201 rmar201      ? ⇥   256   0.007s ./a.out aeiTou
10:33:54 fork  14375 rmar201 rmar201      ? ┬parent          ./a.out aeiTou
10:33:54 fork  14377 rmar201 rmar201      ? └child           ./a.out aeiTou
10:33:54 fork      1    root    root      ? ┬parent          /sbin/init
10:33:54 fork  14378 ncig041 ncig041      ? └child           ./712_2_Laborator9_9 1 2 3 4
10:33:54 exit  14376 ncig041 ncig041      ? ⇥    11   0.003s ./712_2_Laborator9_9 1 2 3 4
10:33:54 fork  14377 rmar201 rmar201      ? ┬parent          ./a.out aeiTou
10:33:54 fork  14379 rmar201 rmar201      ? └child           ./a.out aeiTou
10:33:54 fork  14378 ncig041 ncig041      ? ┬parent          ./712_2_Laborator9_9 1 2 3 4
10:33:54 fork  14380 ncig041 ncig041      ? └child           ./712_2_Laborator9_9 1 2 3 4
10:33:54 exit  14378 ncig041 ncig041      ? ⇥    11   0.002s ./712_2_Laborator9_9 1 2 3 4
10:33:54 fork  14379 rmar201 rmar201      ? ┬parent          ./a.out aeiTou
10:33:54 fork  14381 rmar201 rmar201      ? └child           ./a.out aeiTou
10:33:54 exit  14377 rmar201 rmar201      ? ⇥   256   0.003s ./a.out aeiTou
10:33:54 fork  14381 rmar201 rmar201      ? ┬parent          ./a.out aeiTou
10:33:54 fork  14382 rmar201 rmar201      ? └child           ./a.out aeiTou
10:33:54 exit  14379 rmar201 rmar201      ? ⇥   256   0.003s ./a.out aeiTou
10:33:54 exit  14375 rmar201 rmar201      ? ⇥   256   0.011s ./a.out aeiTou
10:33:54 fork  14380 ncig041 ncig041      ? ┬parent          ./712_2_Laborator9_9 1 2 3 4
10:33:54 fork  14383 ncig041 ncig041      ? └child           ./712_2_Laborator9_9 1 2 3 4
10:33:54 fork  14382 rmar201 rmar201      ? ┬parent          ./a.out aeiTou
10:33:54 fork  14384 rmar201 rmar201      ? └child           ./a.out aeiTou
10:33:54 exit  14380 ncig041 ncig041      ? ⇥    11   0.005s ./712_2_Laborator9_9 1 2 3 4
10:33:54 exit  14381 rmar201 rmar201      ? ⇥   256   0.004s ./a.out aeiTou
10:33:54 exit  14382 rmar201 rmar201      ? ⇥   256   0.004s ./a.out aeiTou
10:33:54 fork  14384 rmar201 rmar201      ? ┬parent          ./a.out aeiTou
10:33:54 fork  14385 rmar201 rmar201      ? └child           ./a.out aeiTou
10:33:54 fork  14383 ncig041 ncig041      ? ┬parent          ./712_2_Laborator9_9 1 2 3 4
10:33:54 fork  14386 ncig041 ncig041      ? └child           ./712_2_Laborator9_9 1 2 3 4
10:33:54 exit  14383 ncig041 ncig041      ? ⇥    11   0.003s ./712_2_Laborator9_9 1 2 3 4
10:33:54 exit  14384 rmar201 rmar201      ? ⇥   256   0.003s ./a.out aeiTou
10:33:54 fork  14385 rmar201 rmar201      ? ┬parent          ./a.out aeiTou
10:33:54 fork  14387 rmar201 rmar201      ? └child           ./a.out aeiTou
10:33:54 fork  14386 ncig041 ncig041      ? ┬parent          ./712_2_Laborator9_9 1 2 3 4
10:33:54 fork  14388 ncig041 ncig041      ? └child           ./712_2_Laborator9_9 1 2 3 4
10:33:54 exit  14386 ncig041 ncig041      ? ⇥    11   0.002s ./712_2_Laborator9_9 1 2 3 4
10:33:54 fork  14387 rmar201 rmar201      ? ┬parent          ./a.out aeiTou
10:33:54 fork  14389 rmar201 rmar201      ? └child           ./a.out aeiTou
10:33:54 exit  14345 ncig041 ncig041      ? ⇥   139   0.044s ./712_2_Laborator9_9 1 2 3 4
10:33:54 exit  14351    root    root      ? ⇥     0   0.041s [/usr/libexec/abrt-hook-ccpp 11 0 14345 48676 600 1620891234 e]
10:33:54 fork  14389 rmar201 rmar201      ? ┬parent          ./a.out aeiTou
10:33:54 fork  14390 rmar201 rmar201      ? └child           ./a.out aeiTou
10:33:54 fork  14388 ncig041 ncig041      ? ┬parent          ./712_2_Laborator9_9 1 2 3 4
10:33:54 fork  14391 ncig041 ncig041      ? └child           ./712_2_Laborator9_9 1 2 3 4
10:33:54 exit  14387 rmar201 rmar201      ? ⇥   256   0.004s ./a.out aeiTou
10:33:54 exit  14385 rmar201 rmar201      ? ⇥   256   0.006s ./a.out aeiTou
10:33:54 fork  14390 rmar201 rmar201      ? ┬parent          ./a.out aeiTou

そして次のようにまとめました。

Fork     Exec     Exit Coredump     Comm    Clone   Ptrace      Uid      Sid    Total Process
 729        0      728        0        0        0        0        0        0     1457 ./a.out aeiTou
 457        0      454        0        0        0        0        0        0      911 ./712_2_Laborator9_9 1 2 3 4
 131       43        0        0        0        0        0        0        0      174 khelper
   0       62        0        0        0        0        0        0        0       62 abrt-hook-ccpp
   9        0       18        0        0        0        0        0        0       27 <unknown>
  (many instances of abrt-hook-ccpp)

私が試したもう一つのことは、niceness 20で実行するように以下を設定することでしたが、forkstatまだ進行中だと言います。

while [ 1 ]; do killall -STOP -u userrunningthebomb ; done

そのユーザーの設定ulimitも試しましたが、/etc/security/limits.conf問題は解決しませんでした。サーバーを再起動しないでください。原因のプロセスはこれ以上ps aux表示されませんhtop

注:a.outと712_2_Laborator9_9は2つの独立したプロセスであり、どちらも同じ動作を示します。ここで説明するのは、a.outとほぼ同じなので、712_2_Laborator9_9です。

再起動以外に何をすべきかわかりません。このようなことが最初に起こったのではなく、なぜこれが起こるのか、そして問題を解決する方法を知りたいのですが。とても感謝しています!

問題のソースコードです。私が発見したときに変更された可能性がありますが、それほど遠くはありません。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]){
//this will be the values array containing the transitted param as int 
int values[argc-1];
int i = 0;

//in the values array are memorized the ints from param        
for( i = 1; i < argc ; i++){
    values[i-1] = atoi(argv[i]);
}

    
// n resembles the nr of integeres passed
int n = argc - 1;
i = 0;

//the arrays answer
int answers[n];
int sum = 0;

//process forking
int process;
//process = fork();

//sum + print
for( i = 0 ; i < n ; i++){
    process = fork();
if(process == 0){
    int j = 0;
    for(j = 0 ; j <= i ; j++){
    //printf("%d\n", values[j]);
    sum = sum + values[j];
    }
        printf("Process%d: %d\n", i, sum);
    exit(0);
}
wait(0);
    
}  
} 

ベストアンサー1

おすすめ記事