1

OSX.plistで使用するファイルをセットアップしようとしています。launchctlコマンドラインから ( を使用せずlaunchctlに) 実行すると、アプリケーションは次のように実行されます。

/path/to/ourapp

... アプリケーションを終了するには、次のように入力します。

/path/to/ourapp -k

...これにより、の新しいインスタンスが、ourapp実行中の以前のインスタンスを適切に強制終了します。

次に、次のように、 を.plist介してアプリケーションの実行を制御するファイルを設定します。launchctl

// start.plist
<dict>
    <key>Disabled</key>
        <false/>
    <key>Label</key>
        <string>ourapp</string>
    <key>ProgramArguments</key>
        <array>
            <string>/path/to/ourapp</string>
        </array>
    <key>OnDemand</key>
        <false/>
    <key>UserName</key>
        <string>daniel347x</string>
    <key>SHAuthorizationRight</key>
        <string>system.preferences</string>
</dict>

...そして、次のようにコマンドラインで実行します。

launchctl load /path/to/start.plist

これは正常に機能し、アプリケーションを起動します。

残念ながら、 を作成するときはstop.plist、次のようになります (唯一の違いは、-k引数の追加です)。

// stop.plist
<dict>
    <key>Disabled</key>
        <false/>
    <key>Label</key>
        <string>ourapp</string>
    <key>ProgramArguments</key>
        <array>
            <string>/path/to/ourapp</string>
            <string>-k</string>  // <-- only difference is adding this argument
        </array>
    <key>OnDemand</key>
        <false/>
    <key>UserName</key>
        <string>daniel347x</string>
    <key>SHAuthorizationRight</key>
        <string>system.preferences</string>
</dict>

...そして経由で実行

launchctl unload /path/to/stop.plist

... アプリケーションは終了しません ... したがって、 を使用するlaunchctlと、アプリケーションは同等に実行されていないようです

/path/to/ourapp -k

誰かが実際に何をしているのかを教えてもらえますか?launchctl unloadつまり、指定された引数を使用してコマンドラインからアプリケーションを呼び出してstop.plistいるlaunchctl unloadかどうか?

4

1 に答える 1

4

上級

いいえ、OSX の「launchctl unload」は「ProgramArguments」をターゲット アプリケーションに渡しません。launchd が実行しているものから plist を削除します。

簡潔な答え

launchctl と launchd を設計どおりに使用しているかどうかはわかりませんが、試してみてください。

launchctl load /path/to/stop.plist

より長い答え

launchctl コマンドは、任意の時点で launchd が実行する plist を制御するために使用されます。発行する場合:

launchctl load /path/to/start.plist

plist が launchd にロードされ、「ourapp」がトリガーされます。重要な点は、「ourapp」が start.plist をアンロードしない限り、まだ launchd で実行されているということです。これは、次の出力を表示することで確認できます。

launchctl list

stop.plist をアンロードする呼び出しが効果を発揮しなかった理由は、最初から launchd にロードされていなかったためです。それを停止できるようにするには、最初に次のように開始する必要があります。

launchctl load /path/to/stop.plist

これの秘訣は、これを行うと、start.plist と stop.plist の両方が実行されることです。明らかに、私はあなたのアプリ/セットアップをテストしていませんが、これは奇妙な動作を引き起こす可能性があります. また、すでに実行されているため、start.plist で「ロード」を再度実行するとどうなるかわかりません。

ここで説明したことからすると、launchd と launchctl が最善のアプローチではない可能性があります。それに固執したい場合は、システムコールを「ourapp」に追加して、killコマンドが発行されたときに開始plistと停止plistの両方もアンロードする必要があると思います。または、plist をアンロードしてから「ourapp -k」を呼び出すプロキシ スクリプトを記述します。そうすれば、次回「launchctl load /path/to/start.plist」を使用するときに、既に実行されているものを開始しようとすることはありません。


もう1つのメモ。「ourapp」をプレースホルダーとして使用しているかもしれませんが、おそらく一意のラベル名を使用する必要があることを指摘する価値があります。他に何もないとしても、「launchctl list」でそれらを追跡するのに役立ちます。launchd 自体に重複した名前の問題があるかどうかはわかりませんが、可能性を避けるのが最も安全だと思われます。

于 2011-07-31T02:57:10.033 に答える