Как управлять группой работников Resque с помощью systemd? - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь перенести контроль над группой рабочих-реставраторов с upstart на systemd.В рамках upstart у нас было два управляющих сценария: один сценарий, который определял одного работника, и второй сценарий, который вызывал первый сценарий несколько раз, чтобы запустить или остановить несколько рабочих с помощью одной команды upstart.Мы пытаемся реализовать ту же возможность, используя systemd.

Я пытался использовать один системный модуль на одного работника, поэтому, если мы пытаемся управлять 6 работниками, мы используем 6 отдельных сценариев системного модуля, одинна одного работника.Затем мы используем сценарий bash для запуска:

systemctl start|stop|restart worker-1.service &
systemctl start|stop|restart worker-2.service &
...

Проблема заключается в том, что, когда мы посылаем сигнал kill через systemctl, он немедленно убивает родительский процесс восстановления, вызывая немедленную смерть всех разветвленных дочерних работников,вместо того, чтобы закончить свою работу перед смертью.Мы смогли реализовать это точное поведение, используя upstart, когда родительский процесс не принимал новые задания (прекратил разветвляться), и дочернему рабочему процессу было позволено остаться в живых, пока он работал над заданием, после того, как задание завершило дочерний рабочий процесс.Умирает сам по себе.

При работе с systemd все работники умирают немедленно, и задания завершаются в середине потока, прежде чем они могут завершиться.

Наш скрипт для модуля systemd выглядит следующим образом:

[Unit]
Description=Controls a single Resque worker process: worker-1
After=redis.service

[Service]
Restart=on-failure
RestartSec=10
StartLimitInterval=400
StartLimitBurst=5
KillSignal=SIGQUIT

User=www-data
WorkingDirectory=/app/working/dir
Type=single
ExecStart=/usr/bin/bundle exec rake production resque:work QUEUE=a,b,c,d,e,f
ExecStop=/bin/kill -QUIT $MAINPID

[Install]
WantedBy=multi-user.target

Я пытался изменить Type = single на Type = разветвление, но процесс не останавливается, он пытается запустить, а затем, когда работа недоступна, так как родительский процесс разветвляется только при наличии работы, процесс умираети не может не ложиться спать.С Type = simple процессы работают как положено, но, как описано выше, мы не можем управлять ими изящно, как мы могли бы с помощью upstart.

Наш скрипт bash выглядит так:

systemctl $COMMAND resque-worker-1.service &

Гдеесть команда для каждого рабочего сервиса.$ COMMAND - это просто аргумент, передаваемый сценарию для (start | stop | restart).

Предыдущие использованные сценарии upstart:

start on runlevel [2345] stop on runlevel [06]

убить сигнал QUIT

1 Ответ

0 голосов
/ 14 октября 2018

Думаю, я решил это сам.Удаляя эту директиву:

ExecStop=/bin/kill -QUIT $MAINPID

Когда я запускаю команду systemctl stop resque-worker-n.service сейчас, она изящно ждет завершения задания, прежде чем убить работника.

Заметил, хотячто некоторые задания все равно будут мгновенно завершаться, поэтому добавили эту директиву:

KillMode=process

Но затем заметили, что при перезапуске рабочих позже «завершенные» задания считались помещенными в очередь посредством resque и поэтому снова ставились в очередь неправильно.Поэтому добавили эту директиву:

SendSIGKILL=no

И теперь поведение кажется идентичным предыдущему поведению, которое мы использовали при использовании upstart.

...