OS X 10.6でlaunchdロギングをアクティブにするにはどうすればよいですか?
正常に起動しない新しいデーモンを追加しました(ステータスは1
)。
問題をデバッグしたいのですが、launchd
ログが見つかりませんでした。/var/log/launchd.log
にはありません。
解決策を見つけた
Sudo launchctl log level debug
そしてこの後
tail -f /var/log/system.log
Launchd plistファイルに次の行を含めると、launchd自体ではなくプロセスをログに記録しようとしていると想定します。
<key>StandardOutPath</key>
<string>/path/to/logfile.log</string>
<key>StandardErrorPath</key>
<string>/path/to/another_logfile.log</string>
そしてプロセスをリロードすると、スクリプトの内部にあるロギングまたは印刷は、実行されるたびにこれら2つのファイルのいずれかにキャプチャされます。ただし、ファイルのローテーションはあなた次第です。ご想像のとおり、両方のインスタンスで同じファイルを使用すると、エラーとstdoutの両方が同じ場所に記録されます。
OS X 10.11(El Capitan)では、@ peterによって提案されたファイルシステムオプションを使用したくない場合は、Sudo launchctl debug <service-target> --stdout --stderr
を使用して1回限りのロギングを有効にできます。
launchctl
の現在の実装では多くのものは異なり、<service-target>
は奇妙なものです。たとえば、私が~/Library/LaunchAgents/dev.localmon.plist
で構成するローカルサービスがあり、「ラベル」dev.localmon
があるとします。その<service-target>
はgui/$UID/dev.localmon
です。ここで、$UID
はユーザーIDです。これは、CLIでこれを実行しているため、シェルが補間します。
ですから、私のdev.localmon
サービスが起動時にクラッシュしたとしたら(そうでした)、次のように呼び出して、launchctl
にプロセスのstdoutとstderrを次回(そして次回のみ)シェルにパイプ接続させることができます。サービスが開始します:
Sudo launchctl debug gui/$UID/dev.localmon --stdout --stderr
オープンアンドレディのTTYでハングアップするため、別のターミナルに移動して次のコマンドを実行します。
launchctl start dev.localmon
# start is a legacy command and doesn't use the fancy new service-target notation
次に、最初のターミナルに戻りますすべき出力を確認します。 (奇妙なことに、サービスプロセスが終了しても閉じないため、Ctrl-Cを押す必要があります。)
ところで、以前にサービスを壊していたPATHまたは環境で構成ファイルを修正したら、ドキュメントのuncache
サブコマンドが次の効果を持っているため、古いlaunchctl unload ~/Library/LaunchAgents/dev.localmon.plist && launchctl load ~/Library/LaunchAgents/dev.localmon.plist
の2ステップを使用する必要があります。
コマンドはまだ実装されていません。
Appleのジョブ後のリリース戦略に賛成:「速く動き、物事を壊す」