Upstart没有发送CONT到我停止的守护进程,它被configuration为使用'expect stop'

我有以下testingconfiguration文件,用于在Ubuntu 14.04上运行的暴发户服务

expect stop chdir /home/joe/Projects/Marketplace env RAILS_ENV="development" script ruby -e "STDOUT.sync=true; puts 'loading...'; sleep 5; Process.kill(:STOP, Process.pid); 5.times { puts 'running'; sleep 3 }" > /tmp/upstart_test.log end script 

embedded的ruby脚本只是睡5秒钟(模拟加载),然后发送一个STOP信号,以便通知Upstart它已经准备好,然后打印几次“运行”(模仿一些服务的发生)。 哇,真棒。 这么简单。

问题是,当我开始这个“服务” start fake-service ,该命令挂起(等待服务完成启动),并且过程结束在停止状态,Upstart从不承认或发送一个“继续”对于。

是什么赋予了??

更新:执行帮助,但分叉仍然失败

我发现,如果在configuration文件中,我使用exec而不是脚本块来运行启动“守护进程”的命令,它工作得很好:

 expect stop chdir /home/joe/Projects/Marketplace env RAILS_ENV="development" exec ruby -e "STDOUT.sync=true; puts 'loading...'; sleep 5; Process.kill(:STOP, Process.pid); 5.times { puts 'running'; sleep 3 }" > /tmp/upstart_test.log 

但是,如果我在脚本中包含一个fork(这是整个使用expect stop一点,我认为 – 帮助Upstart轻松确定主进程PID):

 expect stop chdir /home/joe/Projects/Marketplace env RAILS_ENV="development" exec ruby -e "STDOUT.sync=true; puts 'loading...'; sleep 5; fork { Process.kill(:STOP, Process.pid); 5.times { puts 'running'; sleep 3 } }; Process.wait" > /tmp/upstart_test.log 

Upstart文档确实对脚本块使用期望值有一个警告,但是它特别提到在块中运行多个命令是有问题的,因为它不知道要看哪个命令。 在这种情况下,我只运行一个命令…所以这没有帮助。

事实certificate,我相信,我对expect stop理解是错误的! 正如我上面所说的那样,我认为它被使用了(就像其他expect节一样)“帮助Upstart轻松确定主stream程PID。

现在我重新阅读文档,我相信它是什么意思,它说,“指定作业的主要过程将引发SIGSTOP信号,表明它已经准备好”,是由新贵运行的原始过程提高停止信号,该信号用于确定作业何时准备就绪。 所以这个expect节与另外两个无关,这两个节用于确定包含分叉的工作的主要PID。

而且它对脚本块不起作用的原因是脚本块本身派生了一个新的shell来运行它的内容,所以主进程实际上是块内运行的任何命令的父进程。

现在这一切都变得更有意义:)