問題タブ [launch-daemon]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - RabbitMQ が launchd の使用を開始しない
私は MacPorts エコシステムを使用していますが、rabbitmq-server
ポートは非常に古く、もう機能しません。そこで、 Generic Unix releaserabbitmq-server
を使用して Mac OS X Sierra にインストールしました。できます。
RabbitMQ は以下にインストールされ/usr/local/rabbitmq_server-3.6.5/
、すべての実行可能ファイルへのシンボリック リンクが下にあります/usr/local/sbin/
。
RabbitMQ サーバーを実行すると、すべてが期待どおりに機能します。
デーモンを自動的に開始するために、com.rabbitmq.rabbitmq-server.plist
下に配置したファイルを作成しました/usr/local/etc/LaunchDaemons
。でこのファイルへのシンボリックリンクも作成しました/Library/LaunchDaemons
。所有者はroot
で、グループはwheel
です。
plist ファイルの内容は次のとおりです。
を使用してplistファイルをロードしようとすると
エラーは発生しませんが、デーモンが起動しません。デバッグ情報を plist に追加しようとしましたが、ログにエラーは表示されません。私は何を間違っていますか?
macos - 10 秒ごとに実行される LaunchDaemon - OSX
私がやろうとしているのは、iPhone が Macbook Air(10.11.6) に接続されていることを検出することであり、デバイスの UDID を取得する必要がある場合です。その範囲で、新しい USB が差し込まれたときにスクリプトをトリガーするデーモンを作成しました。
これにより、次のスクリプトがトリガーされます。
スクリプトは UDID を取得しますが、私の問題は停止せず、約 10 秒ごとに実行されることです。
誰でもこの問題を解決できますか? 私が必要とするのは、スクリプトが USB ポートへの接続ごとに 1 回だけ実行されることです。
macos - SMJobBless ヘルパーを含む、ユーザーが .app を削除したときに、.app によってインストールされたアイテムをアンインストールする
短いバージョン: アプリが削除されたときに、アプリによって設定されたヘルパー ツール (SMJobBless()
など) を削除することは可能ですか? もしそうなら、どのように?
長いバージョン:
残念ながら、私たちが開発している Mac アプリは、時折の操作を実行するために管理者権限を必要とします。また、アプリ自体が実行されていない場合でも、他のアプリのプラグインが接続できるようにバックグラウンド タスクを有効にする必要があります (これは非特権である可能性があります)。 . アプリは開発者 ID 証明書で署名され、App Store 以外でのみ配布されます。
アンインストール時にも、アプリが可能な限り「善良な市民」であることを望んでいます。
バックグラウンド タスクでは、 を使用して作成されたログイン項目を使用していますSMLoginItemSetEnabled()
。XPC メッセージングが機能していないように見えるため (CFMessagePort
代わりに使用しています - 代替の提案を歓迎します)、これは驚くべきことではありませんが、ユーザーがアプリを削除すると、少なくとも次回のログイン時にログイン項目が読み込まれなくなります。システムのどこかにまだその痕跡があると思いますが、.app バンドル内の実行可能ファイルが使用されており、それが消えると、ログイン項目は実行されなくなります。
SMJobBless()
管理者権限を必要とする不定期の操作のために、アプリが を使用してインストールし、名前付き XPC サービスを実装する特権ヘルパー ツールが用意されているため、メイン アプリからメッセージを受信すると、タスクがオンデマンドでスピンアップします。これは、Apple が推奨し、Even Better Authorization Sampleで説明しているものです。
ヘルパー実行可能ファイルは によって にコピーさ/Library/PrivilegedHelperTools/
れSMJobBless()
、埋め込まれた launchd.plist は/Library/LaunchDaemons/
. OS にはどのアプリがヘルパーを「所有」しているかに関する情報がありますが、ユーザーがアプリを削除してもアンインストールされないようです。uninstall.sh
Apple のサンプルは、明らかに開発中にのみ使用されることを意図したスクリプトを除いて、アンインストールについて沈黙しています。アプリが実行されていない間はこのヘルパーは必要ないため、本格的な起動デーモンとしてインストールするのは少しやり過ぎですが、パスワード プロンプトでユーザーを繰り返し悩ませることも避けたいと考えています。さらに、Apple は、SMJobBless()
最近よりも管理者権限でコードを実行する他の形式を推奨していません。たとえば、SMJobSubmit()
非推奨とマークされています。
では、どうすれば後片付けができるのでしょうか。
を見つけましSMJobRemove()
たが、(a) 私たちの場合はいつそれを呼び出すのでしょうか - .app バンドルの削除でコードを実行することはできませんか? (b)実際にはクリーンアップされていないようです。
私が考えることができる唯一の2つのことは、ひどく満足のいくものではありません:
- ある種のアンインストーラー アプリまたはスクリプト。しかし、それもかなり醜いようです。
- 心配する必要はありません。ユーザーがアプリを削除するときは、混乱したままにしておくだけです。
macos - コンピューターの再起動時に Launchd タスクがアンロードされる
コンピューターを再起動するように設計されたシェル スクリプトを実行するために使用している単純な launchd plist ファイルがあります。
スクリプト ファイルは、1 行の強制再起動コマンドです (パスワードは実際のファイルにあり、ここには配置されません)。
を使用してplistファイルをロードしたら
リストに表示されます (launchctl リスト)。現在、5 分ごとにスクリプトを実行するための plist ファイルがあります。5 分間の読み込みの後、スクリプトが最初に呼び出され、その後コンピューターが再起動されます。ログインすると、launchd plist ファイルがリスト (launchctl リスト) に表示されなくなります。30 分待ったが、コンピューターを再起動するために再度実行されませんでした。
私の質問は、再起動/強制再起動後に com.sag95.restartscript plist ファイルがアンロードされるのはなぜですか?
macos - Mac Launch Daemon がパスワードをシステム キーチェーンに保存した後、そこからパスワードを取得できない
(必然的に、さまざまな理由から) root として実行され、ネットワーク経由でサーバー コンポーネントと通信する Launch Daemon があります。サービスで認証する必要があるため、最初にパスワードを取得するときに、それをシステム キーチェーンに保存します。その後の起動では、キーチェーンからパスワードを取得し、それを使用してネットワーク サービスで認証するという考え方です。
これは問題なく機能していましたが、macOS 10.12 では既存のコードが機能しなくなり、これを修正する方法に完全に困惑しました。要約すると、次のようになります。
新しいパスワードを保存するか古いパスワードを取得するかに関係なく、これを使用してシステム キーチェーンへの参照を取得します。
また、デーモンのコンテキストでは既にオフになっていると予想されますが、適切な手段としてユーザーの操作を無効にします。
新しいパスワードをキーチェーンに保存するときは、
これだけ効きます。成功が報告され、Keychain Access.app の「システム」キーチェーンに項目が表示されます。
デーモンの後続の実行でそれを取得するには、次の行を使用します。
残念ながら、これはerrSecAuthFailed
私たちには不明な理由で再発し始めています.
私たちがチェックしたいくつかの追加の詳細と試してみましたが、役に立ちませんでした:
- デーモン バイナリは、開発者 ID 証明書で署名されています。
- デーモン バイナリには、バンドル ID とバージョンを含む Info.plist セクションが埋め込まれています。
- Keychain Access.app のパスワード項目の [アクセス制御] タブにある [これらのアプリケーションによるアクセスを常に許可する] リストにデーモン バイナリが表示されます。
- キーチェーンアクセスで「すべてのアプリケーションがこのアイテムにアクセスできるようにする」に手動で切り替えると、機能します。ただし、これは、パスワードをキーチェーンに保存するという点をやや無効にします。
- パラメータを に変更してみ
SecKeychainAddInternetPassword
ましたが、違いはないようです。 - でキーチェーンを明示的にロック解除しようとしまし
SecKeychainUnlock()
たが、ドキュメントが示唆するように、これは不必要なようです。 - ご想像のとおり、アイテムを削除すると yieldが
Keychain Access.app
発生します。したがって、保存されたアイテムを確実に見つけることができますが、それを読み取ることは許可されていません。SecKeychainFindInternetPassword()
errSecItemNotFound
キーチェーンのドキュメントは正確に読むのは簡単ではなく、部分的にはトートロジー的です。(「Y を行うには、Y を行う必要があります」と、Y を実行する理由については言及しません。) それでも、私はそれをやり遂げ、そのほとんどを理解したと思います。特定のセットアップのさまざまな側面 (デーモンからのアクセス) については詳しく説明していませんが、同じアプリによって以前に保存されたアイテムへのアクセスには、特別な承認や認証が必要ないことは明らかです。これは、私たちが見ている動作とは正反対です。
何か案は?
bash - ユーザーとして mac os x アプリケーションを実行しても、それ自体では停止しません
macOS インストーラー パッケージを作成しています。
このために、アプリケーションを起動し、LaunchDaemon plist をロードするポスト インストール スクリプト ファイルを使用しています。
インストール後のスクリプトは次のとおりです。
その結果、sudo -u $USER_NAME /usr/local/TestApp/Test.app/Contents/MacOS/Test -l
コマンドでアプリケーションを開始し、アプリケーションが実行し続けるため、ブロックされます。
そのため、スクリプトがスタックし、LaunchDaemon が読み込まれません。
この場合、どうすればよいか教えてください。
macos - システムの再起動時にアプリケーションが起動しない
アプリケーションを実行する LaunchDaemon サービスを作成しました
ここに私のcom.testapp.plistがあります:
正常に動作しています。しかし、システムを再起動すると、launchdaemon はアプリケーションを起動しますが、アプリケーションを強制終了します。
コンソールに表示されるログは、
また、アプリケーションが実行中であることを示すアクティビティ モニターから、アプリケーションの実行状態を確認しました。
また、デーモンの状態を確認しました
これは、デーモンも実行されていることも示しています。
また、以下はデーモン plist からの stdout ログです (アプリケーションで行ったログが記録されます)。
この問題の主な原因を特定できません。
助けてください。
前もって感謝します。