Fixed reload/stop from the server

This commit is contained in:
Griatch 2015-01-08 22:43:23 +01:00
parent ab052b8301
commit 4f106e5c69
2 changed files with 33 additions and 30 deletions

View File

@ -478,35 +478,38 @@ def get_pid(pidfile):
def del_pid(pidfile): def del_pid(pidfile):
""" """
The pidfile should normally be removed after a process has finished, but The pidfile should normally be removed after a process has
when sending certain signals they remain, so we need to clean them manually. finished, but when sending certain signals they remain, so we need
to clean them manually.
""" """
if os.path.exists(pidfile): if os.path.exists(pidfile):
os.remove(pidfile) os.remove(pidfile)
def kill(pidfile, signal=SIG, succmsg="", errmsg="", restart_file=SERVER_RESTART, restart="reload"): def kill(pidfile, signal=SIG, succmsg="", errmsg="", restart_file=SERVER_RESTART, restart=False):
""" """
Send a kill signal to a process based on PID. A customized success/error Send a kill signal to a process based on PID. A customized
message will be returned. If clean=True, the system will attempt to manually success/error message will be returned. If clean=True, the system
remove the pid file. will attempt to manually remove the pid file.
""" """
pid = get_pid(pidfile) pid = get_pid(pidfile)
if pid: if pid:
if os.name == 'nt': if os.name == 'nt':
if sys.version < "2.7":
print "Windows requires Python 2.7 or higher for this operation."
return
os.remove(pidfile) os.remove(pidfile)
# set restart/norestart flag # set restart/norestart flag
if restart == 'reload': if restart:
django.core.management.call_command('collectstatic', interactive=False, verbosity=0) django.core.management.call_command('collectstatic', interactive=False, verbosity=0)
with open(restart_file, 'w') as f: with open(restart_file, 'w') as f:
f.write(str(restart)) f.write("reload")
else:
with open(restart_file, 'w') as f:
f.write("shutdown")
try: try:
os.kill(int(pid), signal) os.kill(int(pid), signal)
except OSError: except OSError:
print "Process %(pid)s could not be signalled. The PID file '%(pidfile)s' seems stale. Try removing it." % {'pid': pid, 'pidfile': pidfile} print "Process %(pid)s cannot be stopped. "\
"The PID file 'server/%(pidfile)s' seems stale. "\
"Try removing it." % {'pid': pid, 'pidfile': pidfile}
return return
print "Evennia:", succmsg print "Evennia:", succmsg
return return
@ -723,19 +726,19 @@ def run_menu():
if os.name == 'nt': if os.name == 'nt':
print "This operation is not supported under Windows. Log into the game to restart/reload the server." print "This operation is not supported under Windows. Log into the game to restart/reload the server."
return return
kill(SERVER_PIDFILE, SIG, "Server reloaded.", errmsg % "Server", SERVER_RESTART, restart="reload") kill(SERVER_PIDFILE, SIG, "Server reloaded.", errmsg % "Server", SERVER_RESTART, restart=True)
elif inp == 6: elif inp == 6:
if os.name == 'nt': if os.name == 'nt':
print "This operation is not supported under Windows." print "This operation is not supported under Windows."
return return
kill(PORTAL_PIDFILE, SIG, "Portal reloaded (or stopped if in daemon mode).", errmsg % "Portal", PORTAL_RESTART, restart=True) kill(PORTAL_PIDFILE, SIG, "Portal reloaded (or stopped if in daemon mode).", errmsg % "Portal", PORTAL_RESTART, restart=True)
elif inp == 7: elif inp == 7:
kill(PORTAL_PIDFILE, SIG, "Stopped Portal.", errmsg % "Portal", PORTAL_RESTART, restart=False) kill(PORTAL_PIDFILE, SIG, "Stopped Portal.", errmsg % "Portal", PORTAL_RESTART)
kill(SERVER_PIDFILE, SIG, "Stopped Server.", errmsg % "Server", SERVER_RESTART, restart="shutdown") kill(SERVER_PIDFILE, SIG, "Stopped Server.", errmsg % "Server", SERVER_RESTART)
elif inp == 8: elif inp == 8:
kill(SERVER_PIDFILE, SIG, "Stopped Server.", errmsg % "Server", SERVER_RESTART, restart="shutdown") kill(SERVER_PIDFILE, SIG, "Stopped Server.", errmsg % "Server", SERVER_RESTART)
elif inp == 9: elif inp == 9:
kill(PORTAL_PIDFILE, SIG, "Stopped Portal.", errmsg % "Portal", PORTAL_RESTART, restart=False) kill(PORTAL_PIDFILE, SIG, "Stopped Portal.", errmsg % "Portal", PORTAL_RESTART)
return return
else: else:
print "Not a valid option." print "Not a valid option."
@ -791,27 +794,27 @@ def server_operation(mode, service, interactive, profiler):
print "Restarting from command line is not supported under Windows. Log into the game to restart." print "Restarting from command line is not supported under Windows. Log into the game to restart."
return return
if service == 'server': if service == 'server':
kill(SERVER_PIDFILE, SIG, "Server reloaded.", errmsg % 'Server', SERVER_RESTART, restart="reload") kill(SERVER_PIDFILE, SIG, "Server reloaded.", errmsg % 'Server', SERVER_RESTART, restart=True)
elif service == 'portal': elif service == 'portal':
print """ print """
Note: Portal usually don't need to be reloaded unless you are debugging in interactive mode. Note: Portal usually doesnt't need to be reloaded unless you are debugging in interactive mode.
If Portal was running in default Daemon mode, it cannot be restarted. In that case you have If Portal was running in default Daemon mode, it cannot be restarted. In that case you have
to restart it manually with 'evennia.py start portal' to restart it manually with 'evennia.py start portal'
""" """
kill(PORTAL_PIDFILE, SIG, "Portal reloaded (or stopped, if it was in daemon mode).", errmsg % 'Portal', PORTAL_RESTART, restart="reload") kill(PORTAL_PIDFILE, SIG, "Portal reloaded (or stopped, if it was in daemon mode).", errmsg % 'Portal', PORTAL_RESTART, restart=True)
else: # all else: # all
# default mode, only restart server # default mode, only restart server
kill(SERVER_PIDFILE, SIG, "Server reload.", errmsg % 'Server', SERVER_RESTART, restart="reload") kill(SERVER_PIDFILE, SIG, "Server reload.", errmsg % 'Server', SERVER_RESTART, restart=True)
elif mode == 'stop': elif mode == 'stop':
# stop processes, avoiding reload # stop processes, avoiding reload
if service == 'server': if service == 'server':
kill(SERVER_PIDFILE, SIG, "Server stopped.", errmsg % 'Server', SERVER_RESTART, restart="shutdown") kill(SERVER_PIDFILE, SIG, "Server stopped.", errmsg % 'Server', SERVER_RESTART)
elif service == 'portal': elif service == 'portal':
kill(PORTAL_PIDFILE, SIG, "Portal stopped.", errmsg % 'Portal', PORTAL_RESTART, restart=False) kill(PORTAL_PIDFILE, SIG, "Portal stopped.", errmsg % 'Portal', PORTAL_RESTART)
else: else:
kill(PORTAL_PIDFILE, SIG, "Portal stopped.", errmsg % 'Portal', PORTAL_RESTART, restart=False) kill(PORTAL_PIDFILE, SIG, "Portal stopped.", errmsg % 'Portal', PORTAL_RESTART)
kill(SERVER_PIDFILE, SIG, "Server stopped.", errmsg % 'Server', SERVER_RESTART, restart="shutdown") kill(SERVER_PIDFILE, SIG, "Server stopped.", errmsg % 'Server', SERVER_RESTART)

View File

@ -139,7 +139,7 @@ def start_services(server_argv, portal_argv):
def server_waiter(queue): def server_waiter(queue):
try: try:
rc = Popen(server_argv, env=getenv()) rc = Popen(server_argv, env=getenv()).wait()
except Exception, e: except Exception, e:
print PROCESS_ERROR.format(component="Server", traceback=e) print PROCESS_ERROR.format(component="Server", traceback=e)
return return
@ -148,7 +148,7 @@ def start_services(server_argv, portal_argv):
def portal_waiter(queue): def portal_waiter(queue):
try: try:
rc = Popen(portal_argv, env=getenv()) rc = Popen(portal_argv, env=getenv()).wait()
except Exception, e: except Exception, e:
print PROCESS_ERROR.format(component="Portal", traceback=e) print PROCESS_ERROR.format(component="Portal", traceback=e)
return return
@ -183,14 +183,14 @@ def start_services(server_argv, portal_argv):
message, rc = processes.get() message, rc = processes.get()
# restart only if process stopped cleanly # restart only if process stopped cleanly
if (message == "server_stopped" and not rc.returncode and if (message == "server_stopped" and int(rc) == 0 and
get_restart_mode(SERVER_RESTART) in ("True", "reload", "reset")): get_restart_mode(SERVER_RESTART) in ("True", "reload", "reset")):
print PROCESS_RESTART.format(component="Server") print PROCESS_RESTART.format(component="Server")
SERVER = thread.start_new_thread(server_waiter, (processes, )) SERVER = thread.start_new_thread(server_waiter, (processes, ))
continue continue
# normally the portal is not reloaded since it's run as a daemon. # normally the portal is not reloaded since it's run as a daemon.
if (message == "portal_stopped" and not rc.returncode and if (message == "portal_stopped" and int(rc) == 0 and
get_restart_mode(PORTAL_RESTART) == "True"): get_restart_mode(PORTAL_RESTART) == "True"):
print PROCESS_RESTART.format(component="Portal") print PROCESS_RESTART.format(component="Portal")
PORTAL = thread.start_new_thread(portal_waiter, (processes, )) PORTAL = thread.start_new_thread(portal_waiter, (processes, ))