web-dev-qa-db-ja.com

Yosemiteでlaunchctlを使ってデーモンを起動できない

Mavericksでうまく動く~/Library/LaunchAgentsにlaunchdデーモンを置いています。しかし、それはヨセミテのパブリックベータ版では開始されません。デーモンplistは次のようになっています(私のユーザー名はUID 501のdarksairです)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.Apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>LaunchOnlyOnce</key>
    <false/>
    <key>UserName</key>
    <string>darksair</string>
    <key>ProcessType</key>
    <string>Standard</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

基本的には5分ごとに~/bin/retrmail.pyを実行することになっています。

Yosemiteでは、launchdは2.0にアップグレードされ、launchctlには新しいコマンドが追加されました。私は試した

Sudo launchctl kickstart user/501/org.darksair.retrmail

そしてそれは言った

Could not find service "org.darksair.retrmail" in domain for uid: 501

私はまた古い学校を試してみました

Sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

そしてそれは言った

/Users/darksair/Library/LaunchAgents/retrmail.plist: Path had bad ownership/permissions

ファイルは私とスタッフグループが所有しています。私は同じエラーで644と600の両方の許可を試みました。

では、ヨセミテでlaunchdデーモンを正しく起動する方法を知っている人はいますか?


更新:私の起動エージェントファイルはroot:wheelによって所有されなければならないように見えます。私が泣いた後、私は試した

Sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

エラーは発生しませんでした。そして私は私のデーモンが正しく動いていると思います。 launchdの文書には、起動エージェントファイルはデーモンを実行しているユーザーが所有できると明記されていることを覚えているので、この質問は未解決のままにします。


更新2:いいえ、正しく実行されませんでした。一度だけ実行されましたが、アンロードされたかのようには二度と実行されませんでした。


UPDATE3:私はYosemite public beta 3にアップグレードし、そして私のエージェントをこれに変えました

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.Apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>UserName</key>
    <string>darksair</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

私はこのエージェントをリロードしました、そして今私はそれがきちんと働いていると思います。以前のplistの何が問題なのかわからないので、私はまだこの質問を未解決のままにしています。


結論として、ロードするためにplistの所有者をroot:wheelに変更しなければならないことがわかりました。

27
MetroWind

解決策を見つけました。

この場合の正しいコマンドは

launchctl bootstrap gui/501 ~/Library/LaunchAgents/retrmail.plist

そして荷を下すために、

launchctl bootout gui/501 ~/Library/LaunchAgents/retrmail.plist

なぜlaunchctl loadがrootを必要とするのかわからないが、とにかくload/unloadは非推奨です。

4
MetroWind

man launchctlから

ユーザーごとの構成ファイル(LaunchAgents)は、(/ Library/LaunchAgentsにある場合は)ルート、または$ HOME/Library/LaunchAgentsにある場合はユーザーがロードする必要があります。システム全体のデーモン(LaunchDaemons)はすべてrootが所有しなければなりません。設定ファイルはグループとワールドの書き込みを禁止しなければなりません。起動された設定ファイルへの書き込みを許可すると、どの実行可能ファイルを起動するかを指定できるため、これらの制限はセキュリティ上の理由から設定されています。

修正は

Sudo chmod 600 /Library/LaunchDaemons/x.plist
Sudo chown root /Library/LaunchDaemons/x.plist
21
diimdeep

奇妙なことに、Sudoを使うことがあなたの問題でした。 Sudoを使うことで、あなたはもう自分自身ではなくなったので、あなたは自分のファイルの所有者ではありませんでした。 Sudoを削除してコマンドを繰り返すと、正しくロードされるはずです。それへの哲学的アプローチで申し訳ありません。

5
AlexPantea

Root所有の.plistではなくuserを使おうとしているので、これにも遭遇しました。

$ load ~/Library/LaunchAgents/com.blash.blah.plist
Could not find domain for 

私の問題であると思われるコンソール(ヘッドレス)でログインしていない間、私はリモートでこのマシンにログインしました - 少なくともユーザー管理サービスはユーザーがメイン画面でログインする必要がありますこれはヘッドレスマシンであるため、リモート管理を介したログイン)

あなたが個人的にあなたのオプションにログインするためにそこにいなくてもあなたがこれを実行させたいのであれば、IMOは:

  • アカウントを自動的にログインさせます(回答の1つに記載されているように、UserNameタグも含めずにセキュリティへの影響に注意してください)。

  • さまざまな提案に記載されているようにファイルをroot所有にします(すでに持っているようにUserNameを使用してユーザーを自分のものに戻します)。

3
nhed

UserNameキーと文字列を削除します。

問題は、プロセスがrootによって起動されている場合にのみUserNameキーが使用できることです。 plistがrootによって所有されている場合にのみ、rootとして起動できます。基本的に、プロセスはrootによって開始され、それから指定されたユーザーに推奨されます。このプロセスを自分で実行したい場合は、〜/ Library/LaunchAgentsフォルダーにplistを置き、UserNameキーを削除してください。

2

これはばかげた考えです。

私はちょうどヨセミテにアップグレードした後にも、同じエラーがありました。実際には、何らかの理由でplistで参照していたバイナリ(私の場合はcassandra)がその実行可能ファイルを失っていたときに、私は誤ってそれを.plistファイルの悪い所有権/パーミッションと見なしました。

chmod + x'ingして修正しました。

おそらくあなたの問題ではありませんが、一撃の価値があるかもしれません:)

ユーザー権限を持っているエージェントを手動で再ロードしようとしましたか?なぜこれが必要なのか完全には理解できていませんが、あなたはあなたのユーザードメインに所属する必要があると信じています(あなたがrootとして実行したときには所属していないようです)。再接続するためにこれらの関数を使うことは私のために働きました。

function as_user {
    local user="$1"
    local user_pid=$(ps -axj | awk "/^$user / {print \$2;exit}")
    local command="Sudo launchctl bsexec $user_pid Sudo -u '$user' $2"
    echo "Running:"
    echo "$command"
    eval $command
}

function as_current_user {
    as_user "$(whoami)" "$*"
}

function reload_agent {
    as_current_user launchctl unload "$1"
    as_current_user launchctl load "$1"
}

これを次のように使用します。

reload_agent ~/Library/LaunchAgents/com.hw.helloworld.plist

Bsexecはあなたをあなたのドメインに戻し、あなたがユーザーローンチャントとしてタスクを追加することを可能にします。

1
imalison