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


30

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

また、このcronジョブは基本的にディレクトリにCDを挿入してコマンドを実行します。 launchdには、コマンドを実行する予定のディレクトリを指定するためのより良い方法があるはずです。

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

<?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>

回答:


46

フォルダは何ですか .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 詳細については。


ありがとうございました。根本的な問題に答える限り、これはまさに私が探していたものです。このスクリプトは/ Library / LaunchDaemonsにあるため、すでにrootとして実行されていました。
Emmanuel Mwangi

初心者の質問:走っている launchctl デーモンのインストールに必要ですか?つまり、plistファイルを対応するパスにコピーするだけで十分ではありませんか。
Claudix

@ Claudix:その通りです。 launchdの設定をそのままコピーするだけでは不十分です - それでも「有効にする」必要があります(launchctl load)。
Chealion

4

launchdエディタを使ってみましたか?

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

sudo chown root:admin script_to_run_by_launchd

私はこのスクリプトを書くためにLingonを使いました。そして私はそれがLeopardでうまく機能することを確認することができます。
Emmanuel Mwangi

3

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

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

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

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

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

[...]

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


3

特にローンチを実行しようとしているグーグラーのために エージェント 起動の代わりにroot権限で デーモン 、それによってすることができます:

  • でLaunchAgentを作成します。 ~/Library/LaunchAgents
  • でアプリケーションを実行する sudo を介して ProgramArguments あなたのplistの中の財産
  • をセットする NOPASSWD アプリケーションのオプション /etc/resolvers.d

詳細については、 この そして この 回答。


2

発射制御 ヨセミテで私はそれを無痛にした。 それはあなたがサービスを作成または編集するのを助けるために素晴らしいドラッグアンドドロップGUIを持っています。 私が知らなかったすべてのサービスが走っているのを見るのは驚くべきことでした。

ステップ

  1. LaunchControlを起動します。
  2. GlobalDeamonsに変更し、あなたの管理者パスワードを入力してください
  3. ファイル - &gt;新規
  4. ラベルの下に、一意の名前を付けます。規約は「com.company.appname」です。
  5. 実行するプログラムの下で、Unixシェルスクリプト、または引数なしで好きなコマンドを使用します。
  6. アプリに引数が必要な場合は、ドロップダウンフィールドを "Default argv"から "Custom argv"に変更します。
    1. 実際のコマンドラインから実行するのと同じように、通常どおりに引数を指定します。
  7. 「ロード時に実行」はオプションです。
  8. 右側からStartIntervalをドラッグアンドドロップして、必要な間隔を設定します。ヘルプメニューのFAQはとても良いです。

あなたの投稿を編集して、質問者が問題を解決するために取ることができるステップを含めてください。
Cfinley
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.