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


27

~/Library/LaunchAgentsMavericksでうまく機能するlaunchdデーモンを配置しました。しかし、Yosemiteパブリックベータ版では開始されません。デーモンplistは次のようになります(私のユーザー名はdarksairUID 501です)

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

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

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の両方のアクセス許可を試しました。

だから、Yosemiteでlaunchdデーモンを適切に起動する方法を知っていますか?


更新:起動エージェントファイルの所有者はであるようroot:wheelです。チャウンした後、私は試しました

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

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


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


更新3:ヨセミテパブリックベータ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ことです。


これはヨセミテファイナルで機能しますか?
TJルオー14年

@TJLuoma:はい。plistがroot:wheelによって所有されている限り。
MetroWind 14

回答:


21

から man launchctl

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

修正は

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist

2
「またはそれらをロードするユーザー」<—これは私が問題を抱えている部分です。
MetroWind 14

2
私はUNIXの男ではありませんが、「グループと世界の書き込みを許可しない」と書かれています。まだ読む必要があるかもしれないので、そうではないchmod 644でしょうか?
ジェイソン14

5

奇妙なことに、使用sudoが問題でした。を使用することでsudo、あなたは自分ではなくなったため、自分のファイルの所有者ではありませんでした。削除しsudo、コマンドを繰り返します。正常にロードされます。哲学的なアプローチでごめんなさい。


4

ソリューションを見つけました。

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

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

そして、アンロードするには、

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

launchctl loadしかし、なぜrootが必要なのかわかりませんが、ロード/アンロードはとにかく非推奨です。


マニュアルページには、ブートカットではなくブートアウトがリストされています。私のマシンではブートアウトがブートカットに変わるので、オートコレクトがあなたを手に入れたと思います。
スティーブモーザー

@MetroWind上記のコマンドでCode = 112エラーのドメインが見つかりませんでした。一貫性がありません。どんな手掛かり ?
パラグバフナ

まだchmod&が必要chownですか?
イタチ

@イタチ、いや。デフォルトの所有者と許可はそのままにしておく必要があります。
メトロウィンド

@ParagBafna、わかりません。たぶんあなたのUIDは501ではありませんか?
メトロウィンド

3

ルート所有の.plistではなく、ユーザーを使用しようとして(これが実行できるはずです)

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

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

IMO、オプションでログインするために個人的にそこにいなくてもこれを実行したい場合は、次のとおりです。

  • アカウントを自動的にログインします(セキュリティの意味に注意してください。答えの1つに記載されているUserNameタグもありません)。

  • さまざまな提案に記載されているように、ファイルをルート所有にします(既に持っているようにUserNameを使用してユーザーを効果的に設定します)


2
どうもありがとうございます。あなたの答えに解決策を見つけました。
18

2

これはばかげたアイデアです。

Yosemiteにアップグレードした後も、同じエラーが発生しました。実際、何らかの理由で、plistで参照していたバイナリ(私の場合はcassandra)が実行可能ビットを失っていたのに、.plistファイルの所有権/アクセス権が悪いことを意味すると誤って思いました。

chmod + x'ingで修正されました。

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


これは私の場合には当てはまりません。私の実行可能ファイルにはx許可ビットがあります。とにかく答えてくれてありがとう。他の人の助けになることを願っています。
MetroWind 14

2

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

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


zabbix_agendの「ユーザー名」オプションを削除した後、動作します。ありがとうございました!- gist.github.com/chusiang/04db38f5173784e33b68
チュ- Saingライ

奇妙な…「UserName」を削除した後でもロードされない…
MetroWind

1

ユーザー権限のあるエージェントを手動でリロードしようとしましたか?なぜこれが必要なのかは完全にはわかりませんが、ユーザードメインに接続する必要があると思います(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を使用すると、ドメインに戻り、タスクをユーザーlaunchagentとして追加できます。


/Users/darksair/Library/LaunchAgents/retrmail.plist:操作はすでに進行中です。この時点で、私の質問は基本的に次のとおりです。キックスタートコマンドが機能しなかったのはなぜですか。そして、なぜplistの所有権をrootに設定しなければならないのですか…?
MetroWind 14年

1
plistファイルの所有者をrootに設定しないでください。〜/ Library / LaunchAgentsのすべては、そのディレクトリが属するユーザーが所有する必要があります。コマンドをロードする前にアンロードしなかったときに、Operationが進行中のものを取得しました。私が提供した機能を使用していますか?
イマリソン14年

はい。私はあなたの機能を使用していました。そして、最初にplistをアンロードしました…
MetroWind 14年

あなたが提供した最初のplistをロードしようとしましたが、うまくいきました。ファイルにはどのような許可が設定されていますか?
イマリソン14年

これは、非常に多くのことの素晴らしいコードです。私はパペットとカスタムbashスクリプトを組み合わせてさまざまなmacOSデバイスを管理していますが、セキュリティ監査セッションまたはユーザードメインが正しくないために発生するランダムな問題は非常に一般的です。すごい仕事!
アンドリューホワイト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.