저는 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
또 다른 하나는 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);
}
}