答案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
工作原理如下:
mkfifo /tmp/myservice-log-fifo
只是创建 fifo 特殊文件(又名命名管道)。输入man 7 fifo
以了解更多信息。( logger ... </tmp/myservice-log-fifo & )
在后台启动从 fifo 读取的记录器。括号使记录器进程重新成为 init 的父进程,而不是继续作为当前 shell 进程的子进程。exec >/tmp/myservice-log-fifo
将当前 shell 的标准输出重定向到 fifo。现在我们有了该 fifo 的打开文件描述符,实际上我们不再需要文件系统条目了……rm /tmp/myservice-log-fifo
所以我们将把它移除。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
答案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