0

nohupを使用してMacでプロセスを作成しようとしています。プロセスは作成されますが、作成直後に終了します。そのプロセスにはコマンド /usr/bin/wget http://local.domain/some.php があります。これは /var/log/system.log からのエラーです

(0x7fed9c80a940.anonymous.nohup[23454]): Bug: 12E55: launchd + 67394 [7DCC9489-2DF5-3807-83FA-EF5666EE8078]: 0x0
(0x7fed9c80a940.anonymous.nohup[23454]): Switching sessions is not allowed in the system Mach bootstrap.
(0x7fed9c80a940.anonymous.nohup[23454]): _vprocmgr_switch_to_session(): kr = 0x44c

私はこれで数日間立ち往生しています。

プロセスはLinuxで作成され、問題なく実行されます。

4

1 に答える 1

2

文脈の問題だと思います。OsX は Linux ではなく、BSD ベースですが、単なるクローン/ディストリビューションではありません。その核となる部分には、このMachカーネルがあり、DOS (サービス拒否のような) 処理を提供しています。私はこの行からこれを得ました:

Switching sessions is not allowed in the system Mach bootstrap

問題は、Mach がブートストラップ コンテキストを処理する方法だと思います。nohupあなたの場合、実行されたコマンドがログアウト後も存続できる/可能性があることを意味します。を使用する場合wget、これは計算されません。

Mach では、ブートストラップ タスクには、Mach ポートの要求を検索する責任が割り当てられます。この取り組みの一環として、各 Mach タスクは、スタートアップ コンテキストまたはユーザーのログイン コンテキストのいずれかで、2 つのグループのいずれかに登録されます。

ログインコンテキストで使用している子をフォークしてnohupいます。前回チェックしたときは、ログアウト後にクリーンアップされました(autoreleasepoolスタイルのようなものです)。それは本当にうまくいきませんよね?
さらに、リクエストに応答する PHP を扱っていますが、同時に、フォークされた子プロセスは、これらのリクエストを管理するコンテキストよりも長く存続する可能性があります。したがって、これは次の使用に影響しますnohup

コンテキストは、nohup を使用してバックグラウンド ジョブを実行しているユーザーや、screen を使用して端末セッションを切り離しているユーザーにも問題を引き起こします。プログラムがログアウト後も生き残ることが完全に合理的な場合もありますが、デフォルトでは、これは発生しません。

基本的に、ログイン コンテキストからプロセスを実行しているため、子プロセスは同じ (ログイン) コンテキストで自動的に実行されます。あなたの場合、あなたは子プロセスに責任がありますがnohup、それがあなたのコンテキストよりも長生きする可能性があることを意味します。誰もプロセスに責任を負わないため、有害になる可能性があります。コンテキストがスタートアップである必要があります。これは一種の危険です。私はそれを回避する明確な方法を見つけてsu[do]いません。それはコンテキストに影響を与えないため、役に立ちません。
私が考えることができる唯一の方法は、起動コンテキストで実行されるスクリプト/デーモンを作成し、アイドル状態でコマンドを渡すのを待つことです。起動コンテキストで実行されているデーモンは、その中で子プロセスをフォークするためです。独自の (起動) コンテキスト。httpdとにかく、それがどのように機能するかを収集します

それか、3 つ目のコンテキストを作成するかのどちらかですが、それを安全に行う方法を教えてもらえませんでした...

出典: OSX カーネル プログラミング ガイド

于 2013-08-14T12:02:41.973 に答える