意外的 C 叉炸弹 - 被杀后继续分叉

意外的 C 叉炸弹 - 被杀后继续分叉

我负责一台运行内核 2.6.32 的 CentOS 7 服务器,该服务器用于供人们在 Linux 下学习 C 基础知识,不幸的是其中包括fork().有时会发生诚实的事故,进程不断地分叉,就像分叉炸弹一样。

htop第一次发生这种情况时,我通常会终止和中显示的基本进程ps aux,但问题似乎并没有消失。根据htop/sbin/init正在使用 8 个核心的所有 CPU 能力,但仅显示大约 14% 的使用率,而不是预期的 800%。没有其他进程显示为使用资源。

我检查了各种工具来帮助调试这个问题,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

另一个是forkstat -X,它显示了导致分叉和退出的进程(总是比“分叉”的数量少一个“退出”),以及上述进程的许多其他实例:

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,但它没有解决问题。不应重新启动服务器。 Cause 中的过程不再出现在任何地方,无论是在ps aux还是在 中htop

注意:a.out 和 712_2_Laborator9_9 是两个独立的进程,它们都表现出相同的行为。这里描述的是 712_2_Laborator9_9,因为它与 a.out 几乎是一样的

除了重启,我不知道还能做什么。这不是第一次发生这种情况,我想了解为什么会发生这种情况以及如何解决问题。非常感谢!

这是有问题的源代码。请注意,当我找到它时,它可能已经发生了变化,但应该不会太远。

#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);
    
}  
} 

相关内容