重新启动新贵实例进程(Restarting Upstart instance processes)

2019-06-27 06:48发布

我运行一个工人的多个实例,如这个答案说明: 自动启动多个实例新贵

问:我可以重新启动所有情况下一次?

开始我的工作人员,我可以这样做:

开始initctl的我的同事

然后让我做的事情:

状态initctl的工人N = 1个工作者(1)开始/运行,过程551

状态initctl的工人N = 2工人(2)起始/运行时,过程552

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

重启initctl的我的同事

我希望能够重新启动所有实例,而不必知道有多少正在运行。

这里是我的我的,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

Answer 1:

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的所有定义的事件),所以你也应该改变我的同事来stop on runlevel [06]



Answer 2:

我从上面和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

和它的工作!



Answer 3:

考虑加入到worker.conf多了一个事件:

stop on shutdown or workers-stop

然后,你可以在命令行调用

sudo initctl emit workers-stop

您可以添加类似的活动开始的工人。 为了实现重新启动所有工作人员创建将发出工人停止,然后工人开始活动的任务。



Answer 4:

从本质上讲,你需要有很多执行过程stopstart命令为所有的N=1N=2的组合。

一个简单的方法做,这是一对夫妇的bash for内部循环exec script节。 但是,如果过程需要一些时间来停止(例如,因为他们正在研究的东西,他们正在接受SIGTERM已经处理他们目前的工作之后),这是低效的,因为你必须等待一个信号发送到下一个之前停止。

因此,我建立了以阻止他们在平行Upstart脚本来https://github.com/elifesciences/builder-base-formula/blob/master/elife/config/etc-init-multiple-processes-parallel.conf

该脚本是通过使用作为输入盐编图的处理的名字来究竟有多少。 这里有一个简单的结果:

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


文章来源: Restarting Upstart instance processes