我使用
launchd
配置服务以将日志写入文件。
这是启动配置。
<?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>my.label</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/binary</string>
<string>param</string>
</array>
<key>KeepAlive</key>
<true/>
<key>StandardErrorPath</key>
<string>/path/to/logfile.log</string>
<key>StandardOutPath</key>
<string>/path/to/logfile.log</string>
<key>UserName</key>
<string>root</string>
</dict>
</plist>
我使用 newsyslog 来轮换上面目录中的日志。接下来是 newsyslog 配置行
/path/to/logfile.log 644 10 10000 * Z
newsyslog 能够轮换日志。但是,轮换后,launchd 不再写入日志文件。日志文件中的最后一个日志行是。
newsyslog[2662]: logfile turned over due to -F request.
是bug还是使用方法有问题?
这可能是一个愚蠢的问题,但是您的脚本会在轮换日志之前停止服务吗?
对我来说,很明显您需要在轮换日志之前停止服务,然后重新启动服务。
您可以在安排服务时调整开始/停止时间。
更可靠的是从日志轮换脚本中启动和停止它们。
据我所知,launchd 只是将你的 stdout 和 stderr 直接挂接到这两个文件,它不会通过 syslog 或任何东西运行它们。由于您没有在 newsyslog conf 文件中指定 pidfile 选项,因此它会将 HUP 发送到 syslog,这不会执行任何操作。并且您的程序正在写入一个已删除的文件,该文件仍在磁盘上增长,并且可能导致非常令人惊讶的行为:未链接但尚未删除的文件填满整个磁盘!
AFAICT,有两种选择: