使用 Upstart 记录守护进程的输出

使用 Upstart 记录守护进程的输出

我有一个自定义守护进程,由我的 Ubuntu 服务器上的 upstart 管理。它运行完美,只是我需要捕获(记录)守护进程的输出。官方诗节页面说我可以用它console logged来做这个,但是它会记录到哪个文件中?

我也console logged读过不再是有效的节。我目前使用的是 0.3.9 (Hardy),但几个月后会升级到 0.6.x (Lucid)。如果console logged实际上无法使用更高版本,我该使用什么?

答案1

此代码片段将把您的服务的输出通过管道传输到 logger,同时仍允许您执行服务进程(从而替换 shell 进程),这样 upstart 就不会感到困惑。它还确保 logger 进程重新设置为 init,因此它不是您服务的子进程,并且它避免将垃圾留在文件系统中,即使它需要临时创建 fifo。

script
  mkfifo /tmp/myservice-log-fifo
  ( logger -t myservice </tmp/myservice-log-fifo & )
  exec >/tmp/myservice-log-fifo
  rm /tmp/myservice-log-fifo
  exec myservice 2>/dev/null
end script

工作原理如下:

  1. mkfifo /tmp/myservice-log-fifo只是创建 fifo 特殊文件(又名命名管道)。输入man 7 fifo以了解更多信息。
  2. ( logger ... </tmp/myservice-log-fifo & ) 在后台启动从 fifo 读取的记录器。括号使记录器进程重新成为 init 的父进程,而不是继续作为当前 shell 进程的子进程。
  3. exec >/tmp/myservice-log-fifo将当前 shell 的标准输出重定向到 fifo。现在我们有了该 fifo 的打开文件描述符,实际上我们不再需要文件系统条目了……
  4. rm /tmp/myservice-log-fifo所以我们将把它移除。
  5. exec myservice 2>/dev/null只需以通常的方式运行服务即可。Stdout 已进入 fifo,新程序执行时不会发生改变。

更新: set -e不需要,因为 Upstart 默认使用此选项运行脚本(请参阅 http://upstart.ubuntu.com/cookbook/#develop-scripts-using-bin-sh

答案2

对于较新的 Ubuntu 版本(12.04+),只需使用

console log

守护进程输出(STDOUT 和 STDERR)将附加到/var/log/upstart/<service>.log

http://upstart.ubuntu.com/cookbook/#console-log

答案3

如果你使用console output ,然后将脚本的输出通过管道传输到logger(shell 命令接口到 syslog(3) 系统日志模块),这样就可以了。

例如

console output
exec /my/script | logger

将登录到/var/log/messages

例如

console output
exec /my/script | logger -t my-script

将记录/var/log/messages并标记每条消息my-script

logger --help用于记录器使用选项。

(我使用的是基于 Centos 5.x 的 Amazon Linux AMI;YMMV)

答案4

这很丑,但这是迄今为止我发现的最好的

exec /path/to/server >> /tmp/upstart.log 2>&1

相关内容