私は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);
}
}