Files
zulip/scripts/stop-server
Alex Vandiver 476524c0c1 scripts: Add a script to stop the server.
Using `supervisorctl stop all` to stop the server is not terribly
discoverable, and may stop services which are not part of Zulip
proper.

Add an explicit tool which only stops the relevant services.  It also
more carefully controls the order in which services are stopped to
minimize lost requests, and maximally quiesce the server.

Locations which may be stopping _older_ versions of Zulip (without
this script) are left with using `supervisorctl stop all`.

Fixes #14959.
2021-04-21 10:24:08 -07:00

51 lines
1.6 KiB
Python
Executable File

#!/usr/bin/env python3
import logging
import os
import pwd
import subprocess
import sys
import time
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
from scripts.lib.zulip_tools import ENDC, OKGREEN, WARNING
deploy_path = os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))
os.chdir(deploy_path)
if pwd.getpwuid(os.getuid()).pw_name != "zulip":
logging.error("Must be run as user 'zulip'.")
sys.exit(1)
logging.Formatter.converter = time.gmtime
logging.basicConfig(format="%(asctime)s stop-server: %(message)s", level=logging.INFO)
services = []
# Start with the least-critical services:
if os.path.exists("/etc/supervisor/conf.d/zulip/zulip_db.conf"):
services.append("process-fts-updates")
if os.path.exists("/etc/supervisor/conf.d/zulip/thumbor.conf"):
services.append("zulip-thumbor")
# Contrary to the order in (re)start-server, we stop django before the
# workers, to increase the chance that we finish processing any work
# that may have been enqueued by the Django, leaving the final state
# closer to "empty." We stop Django before Tornado so it doesn't try
# to make requests to make queues with a down'd Tornado.
services.append("zulip-django")
services.extend(["zulip-tornado", "zulip-tornado:*"])
services.append("zulip-workers:*")
subprocess.check_call(["supervisorctl", "stop", *services])
print()
print(OKGREEN + "Zulip stopped successfully!" + ENDC)
using_sso = subprocess.check_output(["./scripts/get-django-setting", "USING_APACHE_SSO"])
if using_sso.strip() == b"True":
print()
print(WARNING + "Apache2 needs to be shut down; as root, run:" + ENDC)
print(" service apache2 stop")
print()