Я управляю всеми своими сайтами Django как демоны SCGI. Я не буду вдаваться в основы того, почему я это делаю, но это означает, что когда сайт работает, существует набор процессов, выполняющихся с помощью следующей команды:
/websites/website-name/manage.py runfcgi method=threaded host=127.0.0.1 port=3036 protocol=scgi
Все хорошо, пока я не хочу выкатить новую версию от VCS (Bazaar в моем случае). Я создал скрипт псевдонима, который выполняет следующие действия:
alias up='bzr up; killall manage.py'
Это это общее по одной простой причине: я ленивый. Я хочу одну команду, которую я могу использовать на любом сайте, чтобы обновить его. В любом случае, я в большинстве случаев захожу на сервер, поэтому просто прыгаю в корень нужного сайта и вызываю up
. Обновление сайта от BZR и перезапуски.
Первый недостаток - это уничтожение всех процессов manage.py на машине. В настоящее время 6 сайтов и быстро растут. Второе (и, возможно, еще хуже - по крайней мере, для конечных пользователей) - это крайне незначительный перезапуск. Если кто-то загружает изображение или делает что-то еще с длительным временем соединения, его запрос просто умирает на корню.
Так что я ищу предложения для одного метода, который:
- универсален для ленивых людей, таких как я (например, я могу запустить его из любого корня сайта, не запоминая, какую команду мне нужно вызывать;
'up'
идеально подходит по имени.
- Убивает только текущий сайт. Я только обновляю текущий сайт, поэтому должен умереть только этот.
- Делает перезапуск изящно. Если возможно, следует подождать, пока больше не будет активных соединений. Я понятия не имею, насколько это возможно.