mirror of
https://github.com/evennia/evennia.git
synced 2025-11-01 16:16:54 +00:00
Fixed reload/stop from the server
This commit is contained in:
parent
ab052b8301
commit
4f106e5c69
55
bin/evennia
55
bin/evennia
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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, ))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user