web-dev-qa-db-ja.com

rootとしてlaunchdコマンドを実行する方法

次のlaunchctlコマンドを.plistファイルとして持っています。ロードされ、1日に1回実行されるように設定されていますが、rootとして実行する必要があり、これを確認する方法がわかりません。

また、このcronジョブは基本的にCDをディレクトリーに入れてコマンドを実行します。 launchdには、コマンドを実行することになっているディレクトリを指定するより良い方法があると確信しています。

これがルートとして実行されていることをどのように知ることができますか?これを書くより良い方法はありますか?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>dev.project.frontpage.feedparser</string>
    <key>ProgramArguments</key>
    <array>
        <string>cd</string>
        <string>/Users/eman/src/project/trunk/includes/;</string>
        <string>./feed-parser.php</string>
        <string>-c</string>
        <string>./feed-parser-config.xml</string>
    </array>
    <key>QueueDirectories</key>
    <array/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>12</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>WatchPaths</key>
    <array/>
</dict>
</plist>
33
Emmanuel Mwangi

.plistはどのフォルダに保存されていますか?

launchdはデーモン(/Library/LaunchDaemonsまたは/System/Library/LaunchDaemons)をrootとして実行し、ユーザーがログインしているかどうかに関係なくデーモンを実行します。起動エージェント(/Library/LaunchAgents/または~/Library/LaunchAgents/)は、ユーザーがそのユーザーとしてログインしたときに実行されます。デーモンでスクリプトを実行しているユーザーを変更するためにsetuidを使用することはできません。

/Library/LaunchDaemonsに追加するため、管理者権限でlaunchdにロードする必要があります(例:Sudo launchctl load -w /Library/LaunchDaemons/com.Apple.samplelaunchdscript.plist

詳細については、man launchdをご覧ください。

46
Chealion

Launchdエディターの1つを使用してみましたか?

ルートとして実行されることを確認するために、launchdがプログラムをルートとして実行すると確信しています。 chmodを使用してrootにスクリプトの所有権を与えることを考えたことがありますか?この方法では、rootとして実行しない限り実行されません。次に、それが実行されることを確認する必要があります。

Sudo chown root:admin script_to_run_by_launchd
4
hanleyp

LaunchAgentsのプロパティリストも機能しますが、エージェントとデーモンの両方をSudoでロードする必要があります。

Sudo chown root /Library/LaunchAgents/test.plist
Sudo launchctl load /Library/LaunchAgents/test.plist

Plistに無効なキーがない場合、次のログイン時にロードされるか、デフォルトで再起動され、-wは必要ありません。

テクニカルノートTN2083:デーモンとエージェント

デーモンは、システム全体の一部としてバックグラウンドで実行されるプログラムです(つまり、特定のユーザーに関連付けられていません)。デーモンはGUIを表示できません。より具体的には、ウィンドウサーバーへの接続は許可されていません。

[...]

エージェントは、特定のユーザーに代わってバックグラウンドで実行されるプロセスです。エージェントは、ユーザーのホームディレクトリに確実にアクセスしたり、ウィンドウサーバーに接続したりするなど、デーモンができないことを実行できるので便利です。

3
Lri

LaunchDaemonの代わりにroot権限でLaunchAgentを具体的に実行することを検討しているGoogle社員は、次の方法で実行できます。

  • LaunchAgentを~/Library/LaunchAgentsで作成します
  • PlistのSudoプロパティを介してProgramArgumentsでアプリケーションを実行します
  • アプリケーションのNOPASSWDオプションを/etc/resolvers.dに設定します

詳細については、 this および this の回答を参照してください。

3
Cory Klein

LaunchControl ヨセミテで私にとってそれは苦痛のないものになりました。サービスの作成または編集に役立つ、ニースのドラッグアンドドロップGUIがあります。私が知らないすべてのサービスが実行されているのを見るのは驚くべきことでした。

手順

  1. LaunchControlを起動します
  2. 左上のGlobalDeamonsに変更し、管理者パスワードを入力します
  3. ファイル->新規
  4. ラベルの下に、一意の名前を付けます。規約は「com.company.appname」です
  5. [実行するプログラム]で、Unixシェルスクリプトまたは引数なしの任意のコマンドを使用します。
  6. アプリで引数が必要な場合は、ドロップダウンフィールドを「デフォルトの引数」から「カスタムの引数」に変更します
    1. ここで、実際のコマンドラインから実行するのと同じように、通常の引数を指定します。
  7. ロード時の実行はオプションです。
  8. 右側からStartIntervalをドラッグアンドドロップし、必要な間隔を設定します。 FAQヘルプメニューの下は非常に良いです。
2
Jose Leon