NASの転送は断続的に中断されます。 SIGTERM を送信すると、プロセスリストから消えず、<defunct>
隣にラベルが表示されます。 SIGKILLを送ってもまだ消えず、親がいるので親を殺すことはできませんinit
。プロセスを削除して転送を再開する唯一の方法は、再起動することです。
私ができる最善の方法はトランスポートを修正しようとしていることを知っていますが(私が試したことがあります)、私はコンパイルが初めてであり、急流を操作する前に急流が完了したことを確認したいと思います。
答え1
<defunct>
プロセス(ゾンビプロセスとも呼ばれます)はすでに死んでいるため終了できません。システムは、終了状態を収集するために親プロセスのゾンビプロセスをスケジュールします。親プロセスが終了ステータスを収集しない場合、ゾンビプロセスは永久に維持されます。これらのゾンビプロセスを削除する唯一の方法は、親プロセスを終了することです。親プロセスがinit状態の場合にのみ再起動できます。
ゾンビプロセスはほとんどリソースを消費しないため、これを放置してもパフォーマンスコストは発生しません。ゾンビプロセスがあるということは、通常、いくつかのプログラムにバグがあることを意味します。 Initは通常、すべての子プロセスを収集する必要があります。 initにゾンビの子プロセスがある場合は、initにバグがあります(または他のものですが、それ自体はバグです)。
答え2
Transmission Cのソースコードを変更したい人は、ゾンビとシグナルハンドラを避けるための「デュアルフォーク」トリックとスマート可変生成機能の一部としてそれを使用する方法について読む必要があります。Unixで作成)。
excerpt from:
"Spawning in Unix", http://lubutu.com/code/spawning-in-unix
Double fork
This trick lets you spawn processes whilst avoiding zombies, without
installing any signal handler. The first process forks and waits for its
child; the second process forks and immediately exits and is reaped;
the third process is adopted by init, and executes the desired program.
All zombies accounted for, since init is always waiting.
if(fork() == 0) {
if(fork() == 0) {
execvp(file, argv);
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
wait(NULL);
答え3
今日、私はinitが所有し、多くのシステムリソースを占める死んだプロセスを見つけました。明らかにどこかにバグがありますが、将来の訪問者にバグが可能であることを知りたかったので、詳細についてはZombieのスレッドを確認する必要があります。バラよりhttps://stackoverflow.com/questions/22234609/defunct-processes-using-cpu/67840842#67840842