1

プロセスを生成したい perl スクリプトがあります。しばらく時間がかかる場合があり、ほとんどの場合、親スクリプトは終了します。親がなくなったときに、完了時にゾンビまたは無効なプロセスにならないように、このプロセスを生成するにはどうすればよいですか?

編集:私は2つの方法を見つけたと思います。うまくいけば、どちらがより適切か誰かが教えてくれますか?

  1. 設定 $SIG{CHLD} = 'IGNORE';
  2. POSIX 'setsid' を使用します。

編集: 生成されたプロセスも別の perl スクリプトになります。

4

1 に答える 1

4

プロセスは、終了するとき、およびその親プロセスが。でステータスを取得する前に、ゾンビのようになりますwait()。あるプロセスが別のプロセスをフォークして終了すると、子はpid 1(通常は「init」)の親になり、プロセスの状態をすぐに取得します。したがって、通常、問題はあなたが説明したことの逆です。子はゾンビになります(親が処理しSIGCHLDて呼び出すように作成されていないためwait())が、親が終了すると、ゾンビは継承されinit、すぐに刈り取られます。実際、子プロセスをその親から完全に分離する(「デーモン化」)通常の解決策は、デーモンがすぐにの子になるように、意図的にフォークして中間プロセスを終了させることですinit

編集:シェルを使用していて、この効果を実現したい場合は、を試してください(subprocess &)subprocess括弧は、バックグラウンドで実行されてすぐに終了するサブシェルを作成します。

于 2011-04-08T18:19:29.713 に答える