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

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

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

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 может сохранять свои таблицы состояний для заданий экземпляров при перезагрузках. Почему я предполагаю, что есть некая «таблица состояний»?, потому что я предполагаю, что upstart отслеживает все запущенные задания экземпляров. Должна быть таблица состояний, которая отслеживает, какой экземпляр возрождать при сбое. В противном случае он не сможет возрождать задание экземпляра. Так что если эти таблицы можно сделать постоянными при перезагрузках, моя проблема будет решена.

Можно ли как-то добиться постоянства.? Где upstart отслеживает свои запущенные задания? Только в памяти или в файле?

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

start on runlevel[2345]

не имеет никакого смысла или пользы, например, для работы.

решение1

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

решение2

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

TheРаздел кулинарной книги о строфе экземпляраесть пример того, как делать такие вещи. Я делаю что-то подобное с несколькими экземплярами PostgreSQL; см.этототвечать.

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

Вы правы, что start on/ stop onбесполезен в задании instance. Переместите его в задание "pony engine".

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

Связанный контент