我负责一台运行内核 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);
}
}