macOS launchd 在日志轮换后无法将标准输出重定向到文件

问题描述 投票:0回答:2

我使用

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还是使用方法有问题?

macos launchd launchctl
2个回答
0
投票

这可能是一个愚蠢的问题,但是您的脚本会在轮换日志之前停止服务吗?

对我来说,很明显您需要在轮换日志之前停止服务,然后重新启动服务。

您可以在安排服务时调整开始/停止时间。

更可靠的是从日志轮换脚本中启动和停止它们。


0
投票

据我所知,launchd 只是将你的 stdout 和 stderr 直接挂接到这两个文件,它不会通过 syslog 或任何东西运行它们。由于您没有在 newsyslog conf 文件中指定 pidfile 选项,因此它会将 HUP 发送到 syslog,这不会执行任何操作。并且您的程序正在写入一个已删除的文件,该文件仍在磁盘上增长,并且可能导致非常令人惊讶的行为:未链接但尚未删除的文件填满整个磁盘!

AFAICT,有两种选择:

  1. 使用pidfile选项,让你的程序响应SIGHUP
  2. 使用 syslog 进行日志记录,而不是写入标准输出
© www.soinside.com 2019 - 2024. All rights reserved.