Назад | Перейти на главную страницу

Можно ли использовать runit для запуска нескольких экземпляров одной службы?

Мое программное обеспечение работает на одном phusion-baseimage образ докера на основе. Он состоит из нескольких процессов, которые контролируются запустить его. Для одного из этих процессов / услуг (rqworker), Мне нужно запустить несколько экземпляров на основе конфигурации, зависящей от развертывания (которая представляет собой просто количество параллельных rqworkers). Мне кажется, что runit не поддерживает установку количества запускаемых экземпляров для каждой службы.

Есть ли какие-то способы обойти это в самом runit или мне лучше запустить что-то вроде руководитель как runit сервис и позволить ему позаботиться о rqworkers?

Многопроцессорный сервис можно легко обернуть, используя следующий принцип:

  • последняя команда не должна вызывать ошибок, поэтому она может быть sleep infinity вместо реального процесса.
  • другие команды выполняются как фоновые задания с использованием &

Этот фрагмент показывает, как это работает. Положите это в /etc/service/your-service/run и сделайте его работоспособным, а затем замените cmd в строке 5 вашими вызовами rqworker.

#!/bin/bash
# have in env: WORKER_COUNT=7
for i in $(seq 1 $WORKER_COUNT)
do
  sleep $((i + 100)) &
done
sleep infinity

ps afx:

   21 pts/0    S+     0:00 /usr/bin/runsvdir -P /etc/service
   26 ?        Ss     0:00  \_ runsv json-server
 2525 ?        S      0:00      \_ /bin/bash ./run
 2527 ?        S      0:00          \_ /bin/bash ./run
 2541 ?        S      0:00          |   \_ sleep 101
 2528 ?        S      0:00          \_ /bin/bash ./run
 2540 ?        S      0:00          |   \_ sleep 102
 2529 ?        S      0:00          \_ /bin/bash ./run
 2539 ?        S      0:00          |   \_ sleep 103
 2530 ?        S      0:00          \_ /bin/bash ./run
 2538 ?        S      0:00          |   \_ sleep 104
 2531 ?        S      0:00          \_ /bin/bash ./run
 2537 ?        S      0:00          |   \_ sleep 105
 2532 ?        S      0:00          \_ /bin/bash ./run
 2536 ?        S      0:00          |   \_ sleep 106
 2533 ?        S      0:00          \_ /bin/bash ./run
 2535 ?        S      0:00          |   \_ sleep 107
 2534 ?        S      0:00          \_ sleep infinity

Если этот хакерский прием Sleep Infinity вас смущает, просто замените его каким-нибудь замечательным изменением информации. sleep infinity в

bash -c 'exec -a softagram-is-cool-and-hip-until sleep infinity' &

..и мы закончили:

     2533 ?        S      0:00          \_ /bin/bash ./run
     2535 ?        S      0:00          |   \_ your-kick-ass-service-1
     2535 ?        S      0:00          |   \_ your-kick-ass-service-2
     2534 ?        S      0:00          \_ softagram-is-cool-and-hip-until infinity