3

私は、OS X でデーモンの自己アップデーターを実装する作業を行っています。更新は .pkg ファイルとして公開されているため、次のようにしようとしています。更新が利用可能であることがデーモンに通知されると、 system() 呼び出しを介してインストーラーを呼び出し、パッケージをインストールします。このパッケージには、新しいバージョンのデーモン、デーモンを停止するアップグレード前スクリプト ( launchctl unload /Library/LaunchDaemons/foo.plist)、および新しいバージョンのインストール後にデーモンをバックアップするポストフライト スクリプトが含まれています。私が抱えている問題は、インストーラー プロセスが途中で終了することです。インストーラーが親プロセスを更新するために親プロセスを強制終了し、独自の孤立したプロセスとして続行するのではなく、自分自身を強制終了したことが原因である可能性があると思われます。私は運がないので、次のことを試しました:

  • '&' を使用してインストーラー コマンドを後置し、バックグラウンドで実行する
  • インストーラー コマンドをnohupでラップする

インストール コマンドは、コマンド ラインから実行するとエラーなしで一貫して完了し、インストーラーから実行すると一貫して失敗します。インストーラーから呼び出されると、出力をファイルにパイプしますが、何もない場合もあれば、出力が停止する前にインストールが約 41% 完了したことを示す場合もあります。プロセスに何が起こっているのかを把握したり、親なしでプロセスが存続していることを確認したりする方法についてのアイデアはありますか?

4

1 に答える 1

2

を呼び出すとlaunchctl unload、プロセス グループ全体が強制終了されます (単純な とは異なりますkill)。サブプロセスを別のプロセス グループに移動したい。最も簡単な方法は、C call を使用することsetsid()です。

シェル スクリプトの途中である場合は、次のアプローチを検討する必要があります。私はCプログラムを扱っていたので、これらを試していませんでしたsetsid()

  • インストーラーを呼び出す前に、set -m. これは、「バックグラウンドプロセスは別のプロセスグループで実行され、完了時に終了ステータスを含む行が出力される」というモニターモードをオンにすることになっています。
  • このサブインタラクティブ シェル トリックを試してください:シェル スクリプトの新しいプロセス グループ
于 2012-08-07T04:02:25.260 に答える