我有一个自定义守护程序,由我的ubuntu服务器上的upstart管理.除了我需要捕获(记录)守护进程的输出之外,它完美地工作.
official stanzas page说我可以使用控制台记录来执行此操作,但它记录的文件是什么?
我还看到登录的控制台是no longer a valid stanza.我目前正在使用0.3.9(Hardy),但在几个月后将升级到0.6.x(Lucid).如果控制台登录实际上不适用于更高版本,我应该使用什么?
此代码段将管道您的服务输出
进入记录器,同时仍允许你执行
服务流程(从而取代shell流程)
所以新贵不会感到困惑.它也使
确保记录器进程被重新分配给init,所以
它不是你服务的孩子,它避免了
即使是在文件系统中也不停地坐着
虽然它需要暂时创建一个fifo.
进入记录器,同时仍允许你执行
服务流程(从而取代shell流程)
所以新贵不会感到困惑.它也使
确保记录器进程被重新分配给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读取记录器. parens导致记录器进程被重新分配给init,而不是保留当前shell进程的子进程.
> exec> / tmp / myservice-log-fifo将当前shell的stdout重定向到fifo.现在我们有一个针对该fifo的开放文件描述符,我们实际上不再需要文件系统条目了…
> rm / tmp / myservice-log-fifo所以我们将删除它.
> exec myservice 2> / dev / null只是以通常的方式运行服务. Stdout已经进入了fifo,并且在新程序执行时不会改变.
更新:因为Upstart默认使用此选项运行脚本,所以不需要设置-e(参见http://upstart.ubuntu.com/cookbook/#develop-scripts-using-bin-sh)