Задание запуска экземпляра при перезагрузке системы

Я использую рабочие места выскочившего экземпляра, чтобы запустить несколько своих сервисов. Задания должны иметь один экземпляр на пользователя, т.е. они принимают имя пользователя в качестве параметра экземпляра. Я также настроил их на возрождение. Возрождение работает. Вот как выглядит мой конфигурационный файл

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

normal exit 0

respawn
respawn limit 5 300
instance $user

chdir /home/talha/syncservice/
script
   exec python sync.py $user
end script

Проблема в том, что я хочу, чтобы эти задания экземпляра были перезапущены при перезагрузке системы. Очевидно, что я не могу передать все имена пользователей в качестве параметров экземпляра при перезагрузке, так как я не знаю, что и сколько экземпляров было создано в прошлый раз.

Есть ли способ, чтобы выскочка могла сохранять свои таблицы состояний, например, задания при перезагрузке. Почему я предполагаю, что существует какая-то "таблица состояний"?, потому что я предполагаю, что upstart отслеживает все запущенные задания экземпляра. Там будет таблица состояний, которая отслеживает, какой экземпляр возрождается в случае сбоя. В противном случае он не сможет возродить задание экземпляра. Поэтому, если эти таблицы можно будет сделать постоянными при перезагрузках, моя проблема будет решена.

Можно ли как-то добиться упорства? Где выскочка следит за своими работами? Это только в памяти или в файле?

Если это не может быть сделано, это означает, что строфа

start on runlevel[2345]

не имеет смысла или выгоды, например, рабочих мест.

2 ответа

Решение

Вы можете сохранить список пользователей в файл (в этом примере user-sync.list). Чтобы восстановить пользовательские сценарии, вы можете использовать цикл for в сценарии bash, который запускается пользователем root при загрузке. Где ваш скрипт инициализации называется user-sync:

#!/bin/sh
# /root/restore-user-sync.sh
for user in `cat user-sync.list`; do start user-sync user=$user; done

Добавьте это в crontab как root:

$ crontab -e

В файле cron:

@reboot /root/restore-user-sync.sh

Ведение списка активных пользователей является наиболее важной частью. Вы можете сделать это с помощью сценария Python или сделать это как часть сценария Upstart:

# /etc/init/user-sync.conf

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

normal exit 0

respawn
respawn limit 5 300
instance $user

chdir /home/talha/syncservice/

pre-start script
    # if $user doesn't already exist in list, add $user to list
    if ! grep $user user-sync.list; then echo $user >> user-sync.list; fi
end script

script
   exec python sync.py $user
end script

pre-stop script
    # remove line(s) from list that exactly match $user
    sed -i "/\b$user\b/d" user-sync.list
end script

Возможно, вы сможете заменить $USER (который автоматически определяется как текущее имя пользователя) на $user, в противном случае при вызове сценария upstart вам потребуется передать имя пользователя в качестве параметра:

sudo start user-sync user=myusername

Я определенно отклонился бы от попадания под капот выскочки. Вы можете сделать это по-другому.

В разделе " Поваренная книга", посвященном разделу об экземплярах, есть пример того, как делать такие вещи. Я делаю что-то подобное с несколькими экземплярами PostgreSQL; увидеть этот ответ.

Основная идея здесь состоит в том, чтобы создать то, что я называю заданием "движок пони", которое запускает все ваши задания экземпляра. В вашем случае вы можете сделать так, чтобы он перебирал подкаталоги /home или сохраните отдельный файл conf, в котором перечислены пользователи, для которых вы хотите, чтобы служба работала. Для каждого пользователя запустите экземпляр sync.py.

Вы правы в том, что start on / stop on бесполезен в работе экземпляра. Переместите его на задание "двигатель пони".

К сожалению, у меня нет доступа к Linux-боксу сейчас, но см. Вышеупомянутый ответ для примеров.

Другие вопросы по тегам