如何在 OS X 上激活启动日志?

sor*_*rin 46 mac-osx launchd launchctl

如何在 OS X 10.6 上激活启动日志?

我添加了一个无法正常启动的新守护进程(状态为1)。

我想调试问题,但找不到launchd日志,它们不在/var/log/launchd.log.

小智 31

假设您正在尝试记录您的进程而不是 launchd 本身,如果您在 launchd plist 文件中包含以下几行:

<key>StandardOutPath</key>
<string>/path/to/logfile.log</string>
<key>StandardErrorPath</key>
<string>/path/to/another_logfile.log</string>
Run Code Online (Sandbox Code Playgroud)

并重新加载该过程,无论何时运行,您的脚本内部的任何日志记录或打印都将被捕获在这两个文件之一中。尽管旋转文件似乎取决于您。正如您所料,如果您在两个实例中使用相同的文件,它会将错误和标准输出记录到同一位置。

请参阅:创建启动守护程序和代理中的调试启动作业部分


sor*_*rin 29

我找到了解决方案

 sudo launchctl log level debug 
Run Code Online (Sandbox Code Playgroud)

在这之后

 tail -f /var/log/system.log
Run Code Online (Sandbox Code Playgroud)

  • 自 10.10 优胜美地以来,这不再有效。launchctl 版本:Darwin System Bootstrapper 2.0.0:Tue Sep 9 16:30:56 PDT 2014 (31认同)
  • @JeanMertz - 还有其他选择吗? (12认同)
  • 我意识到这个操作系统需要管理员,就像其他任何东西一样。经过一天的尖叫“WTF 详细标志在哪里!”之后,我完全在寻找这个。OSX 确实很强大,但是很难掌握。谢谢+1 (2认同)

chb*_*own 21

在 OS X 10.11 (El Capitan) 上,sudo launchctl debug <service-target> --stdout --stderr如果您不想采用 @peter 建议的文件系统选项,则可以使用来启用一次性日志记录。

的当前实现中有很多东西是不同的launchctl,而且<service-target>有点奇怪。例如,假设我有一个配置在 的本地服务~/Library/LaunchAgents/dev.localmon.plist,它具有 "label" dev.localmon。它<service-target>gui/$UID/dev.localmon,其中$UID您的用户 ID,因为您在 CLI 上运行它,您的 shell 将为您进行插值。

因此,假设我的dev.localmon服务在启动时崩溃(确实如此),我可以调用以下内容,以便launchctl在下一次(并且仅在下一次)服务启动时将进程的 stdout 和 stderr通过管道传输到我的 shell 中:

sudo launchctl debug gui/$UID/dev.localmon --stdout --stderr
Run Code Online (Sandbox Code Playgroud)

由于这与开放就绪的 TTY 相关,请转到另一个终端并运行:

launchctl start dev.localmon
# start is a legacy command and doesn't use the fancy new service-target notation
Run Code Online (Sandbox Code Playgroud)

然后,回到第一个终端,你应该看到输出。(奇怪的是,当服务进程终止时它不会关闭,因此您必须按 Ctrl-C。)

顺便说一句,一旦您使用之前破坏服务的任何 PATH 或环境修复了配置文件,您仍然必须使用旧launchctl unload ~/Library/LaunchAgents/dev.localmon.plist && launchctl load ~/Library/LaunchAgents/dev.localmon.plist的两步,因为文档中声称的uncache子命令具有以下效果:

命令尚未执行。

苹果的后乔布斯发布策略是:“快速行动,打破常规”