问题描述
我正在按照此答案中的说明运行一个工作程序的多个实例:Starting multiple upstart instances automatically
问题:是否可以立即重新启动所有实例?
要开始我的工人,我可以做:
initctl start my-workers
然后,我可以这样做:
initctl status worker N=1 worker (1) start/running, process 551
initctl status worker N=2 worker (2) start/running, process 552
有没有办法做这样的事情:
initctl restart my-workers
我希望能够重新启动所有实例,而不必知道有多少实例在运行。
这是我的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
和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
最佳思路
在worker.conf
中,您只需要更改以下行:
stop on shutdown
至:
stop on stopping my-workers
并将my-workers.conf
更改为使用pre-start
而不是script
:
pre-start script
for i in `seq 1 $NUM_WORKERS`
do
start worker N=$i
done
end script
现在,my-workers
将保持状态:由于工作发生在pre-start
中,因此my-workers
主进程将不存在,因此不会退出。每当my-workers
停止时,stop on stopping my-workers
会使工作人员停止。当然,当它再次启动时,它将再次启动工作程序。
(FYI,stop on shutdown
不执行任何操作,因为shutdown
不是系统事件。对于所有已定义的事件,都是man upstart-events
),因此还应该将my-workers更改为stop on runlevel [06]
次佳思路
我从上面的示例和SpamapS答案中进行了尝试,得到了:
init: my-workers pre-start process (22955) terminated with status 127
在/var/log/upstart/my-workers.log
中,我发现了问题:
/proc/self/fd/9: 6: /proc/self/fd/9: end: not found
my-workers.conf
中的for-loop的end
似乎是错误的语法。我更换了
script
for i in `seq 1 $NUM_WORKERS`
do
start worker N=$i
done
end
end script
与
script
for i in `seq 1 $NUM_WORKERS`
do
start worker N=$i
done
end script
而且有效!