우발적인 C-포크 폭탄 - 사망한 후에도 계속 포크됩니다.

우발적인 C-포크 폭탄 - 사망한 후에도 계속 포크됩니다.

저는 Linux에서 C의 기본을 배우는 사람들을 위해 커널 2.6.32를 실행하는 CentOS 7 서버를 담당하고 있습니다. 불행하게도 여기에는 다음이 포함됩니다 fork(). 때로는 정직한 사고가 발생하고 포크 폭탄처럼 프로세스가 계속 분기됩니다.

htop이런 일이 처음 발생하면 일반적으로 에 표시된 기본 프로세스를 종료하지만 ps aux문제는 사라지지 않는 것 같습니다. htop에 따르면 /sbin/init8개 코어의 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

또 다른 하나는 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문제가 해결되지 않았습니다. 서버를 다시 시작하면 안 됩니다. 원인의 프로세스는 더 이상 ps aux이나 에서 나타나지 않습니다 htop.

참고: a.out과 712_2_Laborator9_9는 두 개의 독립적인 프로세스이며 둘 다 동일한 동작을 나타냅니다. 여기서 설명하는 것은 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);
    
}  
} 

관련 정보