重新启动Upstart实例进程

Ros*_*oss 30 ubuntu upstart

我正在运行多个工作实例,如本答案中所述:自动启动多个upstart实例

问题:我可以一次重启所有实例吗?

要开始我的工作,我可以做:

initctl启动我的工作者

然后允许我这样做:

initctl status worker N = 1 worker(1)启动/运行,进程551

initctl status worker N = 2 worker(2)start/running,process 552

有没有办法做这样的事情:

initctl重启我的工作者

我希望能够重新启动所有实例,而无需知道有多少实例正在运行.

这是我的my-workers.conf

start on stopped cloud-init
stop on shutdown

env NUM_WORKERS=4

script
  for i in `seq 1 $NUM_WORKERS`
    do
      start worker N=$i
    done
end script
Run Code Online (Sandbox Code Playgroud)

和worker.conf

stop on shutdown

chdir /path/to/current

respawn

instance $N

script
  exec su -c "/home/worker/.rvm/bin/rvm-shell -c 'bundle exec rake work 2>&1 >> /var/log/worker-$N.log'" worker
end script
Run Code Online (Sandbox Code Playgroud)

Spa*_*apS 36

worker.conf你只需要改变这一行:

stop on shutdown
Run Code Online (Sandbox Code Playgroud)

至:

stop on stopping my-workers
Run Code Online (Sandbox Code Playgroud)

my-workers.conf改为使用pre-start而不是script:

pre-start script
  for i in `seq 1 $NUM_WORKERS`
  do
    start worker N=$i
  done
end script
Run Code Online (Sandbox Code Playgroud)

现在my-workers将保持状态:由于工作发生pre-start,my-workers主进程将不存在,因此不会退出. stop on stopping my-workers每当停止时,工人都会my-workers停下来.当然,当它再次启动时,它将再次启动工人.

(仅供参考,stop on shutdown不执行任何操作,因为shutdown不是系统事件.man upstart-events对于所有已定义的事件)所以您还应该将我的工作人员更改为stop on runlevel [06]

  • 我花了一段时间才明白你的意思,但是一旦我明白你的意思......*心灵狂热* (4认同)

Foo*_*bar 7

我试着用上面的例子和SpamapS回答,我收到了:

init: my-workers pre-start process (22955) terminated with status 127
Run Code Online (Sandbox Code Playgroud)

/var/log/upstart/my-workers.log我发现问题:

/proc/self/fd/9: 6: /proc/self/fd/9: end: not found
Run Code Online (Sandbox Code Playgroud)

end在for循环的my-workers.conf似乎是错误的语法.我换了

script
  for i in `seq 1 $NUM_WORKERS`
    do
      start worker N=$i
    done
  end
end script
Run Code Online (Sandbox Code Playgroud)

script
  for i in `seq 1 $NUM_WORKERS`
  do
    start worker N=$i
  done
end script
Run Code Online (Sandbox Code Playgroud)

它工作了!