我正在运行多个工人实例,如本答案中所述:Starting multiple upstart instances automatically
问题:我可以一次重启所有实例吗?
为了开始我的工作,我可以做到:
initctl启动my-workers
然后允许我这样做:
initctl status worker N = 1 worker(1)启动/运行,进程551
initctl status worker N = 2 worker(2)start / running,process 552
有没有办法做这样的事情:
initctl重启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
答案 0 :(得分:36)
在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
主进程将不存在,因此不会退出。 stop on stopping my-workers
会导致工作人员在my-workers
停止时停止。当然,当它再次启动时,它将再次启动工人。
(仅供参考,stop on shutdown
不执行任何操作,因为shutdown
不是系统事件。man upstart-events
适用于所有已定义的事件)所以您还应该将我的工作人员更改为{{1} }
答案 1 :(得分:7)
我尝试了上面的例子和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
end
中for循环的my-workers.conf
似乎是错误的语法。
我换了
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
它有效!
答案 2 :(得分:1)
考虑再向worker.conf添加一个事件:
stop on shutdown or workers-stop
然后你可以从命令行调用
sudo initctl emit workers-stop
您可以为启动工作人员添加类似的事件。要实现重新启动,所有工作人员都会创建一个任务,该任务将发出工作人员停止,然后是工人启动事件。
答案 3 :(得分:0)
基本上,您需要拥有一个为您的stop
,start
组合执行许多N=1
和N=2
命令的流程。
执行此操作的一种简单方法是在for
节中包含两个bash exec script
循环。但是,如果这些过程需要一些时间来停止(例如因为他们正在处理某些事情并且在处理完当前作业后他们正在接受SIGTERM
),这是低效的,因为你必须在发送信号之前等待一个停止到下一个。
因此,我构建了一个Upstart脚本,可以在https://github.com/elifesciences/builder-base-formula/blob/master/elife/config/etc-init-multiple-processes-parallel.conf
并行停止它们该脚本由Salt编译,使用进程名称的映射作为输入。以下是一个示例结果:
description "(Re)starts all instances, in parallel"
# http://upstart.ubuntu.com/cookbook/#start-on
start on (local-filesystems and net-device-up IFACE!=lo)
task
script
timeout=300
echo "--------"
echo "Current status of 5 elife-bot-worker processes"
echo "Now is" $(date -Iseconds)
for i in `seq 1 5`
do
status elife-bot-worker ID=$i || true
done
echo "Stopping asynchronously 5 elife-bot-worker processes"
echo "Now is" $(date -Iseconds)
for i in `seq 1 5`
do
(stop elife-bot-worker ID=$i &) || true
done
for i in `seq 1 5`
do
echo "Waiting for elife-bot-worker $i to stop"
echo "Now is" $(date -Iseconds)
counter=0
while true
do
if [ "$counter" -gt "$timeout" ]
then
echo "It shouldn't take more than $timeout seconds to kill all the elife-bot-worker processes"
exit 1
fi
status elife-bot-worker ID=$i 2>&1 | grep "Unknown instance" && break
sleep 1
counter=$((counter + 1))
done
done
echo "Stopped all elife-bot-worker processes"
echo "Starting 5 elife-bot-worker processes"
for i in `seq 1 5`
do
start elife-bot-worker ID=$i
done
echo "Started 5 elife-bot-worker processes"
end script