ログインするたびにバックグラウンドで実行されるユニゾン同期サービスを実行したい。しかし、エージェントのステータスコードは78
。理由はわかりませんが、オンラインで投稿された修正を試しましたが、うまくいきません。
どうしたの??以下は私のサービスのplistファイルです。
<?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>syncmyproject</string>
<key>StandardOutPath</key>
<string>/var/log/syncmyproject.log</string>
<key>StandardErrorPath</key>
<string>/var/log/syncmyproject.log</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>Debug</key>
<true/>
<key>EnableGlobbing</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/unison</string>
<string>-auto</string>
<string>-batch</string>
<string>-repeat watch</string>
<string>~/home/project</string>
<string>~/project</string>
</array>
</dict>
</plist>
man launchctl
を読んで、78がfunction not implemented
を意味することを見つけます。それはあまり役に立ちません。
最後に、plistにエラーがあり、実際に動作するようにします。launchctlのGUIツールであるbrew cask install launchcontrol
をインストールすることをお勧めします。これはエラーの検出とトラブルシューティングに役立ちます。
エラーは権限に関係していることがわかりました。エラーをリダイレクトして、ユーザーが書き込みできない/var/log
ディレクトリにログを記録しようとしていました。ユーザーがr + wに対する適切な権限を持っている場所にパスを変更すると、修正されました。
また、LaunchAgentをロードするときは注意してください。 〜/ Library/LaunchAgentsディレクトリにいる場合は、Sudoを使用してplistをロードしないでください。
[この問題にも遭遇したので、発見したことを文書化する]
「78」は、実行中のジョブの最後の終了コードです。 man launchctl
から:
引数なしで、launchdにロードされたすべてのジョブを3列にリストします。最初の列には、実行中のジョブのPIDが表示されます。 2番目の列には、ジョブの最後の終了ステータスが表示されます。この列の数値が負の場合、ジョブを停止した信号の負を表します。したがって、「-15」は、ジョブがSIGTERMで終了したことを示します。 3番目の列は、ジョブのラベルです。 [label]が指定されている場合、要求されたジョブに関する情報を出力します。
つまり開始するジョブのドキュメント(またはソースコード)を読む必要があります。 (私の場合、mysqld)
Linuxでは、「78」が 標準終了コード として言及されており、設定エラーを示していることに注意してください。そのため、ジョブの構成(およびエラーログ)を調べて、構成に誤りがあるかどうかを確認してください。
ここに私を捕らえたものがあります:Mac OS Xでは、ファイルに「スクリプトだけ」がある場合でも、コマンドラインからシェルスクリプトを実行できます。ただし、launchdからそれらを実行する場合は、スクリプトを実行するバイナリを指定する必要があります。コマンドラインから実行する場合、現在のシェル(私の場合はbash)を使用するだけですが、launchdから実行する場合、「周囲のスクリプト」はありません。追加した
#!/bin/sh
スクリプトファイルの最初の行として、それが機能しました。
上記と同様に、スクリプトパスにシンボリックリンクがあるため、ステータス78になりました。修正は、絶対パスを使用することでした。