mirror of
https://github.com/evennia/evennia.git
synced 2026-03-27 02:06:32 +01:00
Remove Unix-centric Zombie-process removal that eats Windows
This commit is contained in:
parent
582c2a377e
commit
8dce90408d
2 changed files with 31 additions and 17 deletions
|
|
@ -481,6 +481,11 @@ Others, like migrate, test and shell is passed on to Django."""
|
|||
#
|
||||
# ------------------------------------------------------------
|
||||
|
||||
|
||||
def _is_windows():
|
||||
return os.name == 'nt'
|
||||
|
||||
|
||||
def _print_info(portal_info_dict, server_info_dict):
|
||||
"""
|
||||
Format info dicts from the Portal/Server for display
|
||||
|
|
@ -811,7 +816,7 @@ def start_evennia(pprofiler=False, sprofiler=False):
|
|||
def _portal_not_running(fail):
|
||||
print("Portal starting {}...".format("(under cProfile)" if pprofiler else ""))
|
||||
try:
|
||||
if os.name == 'nt':
|
||||
if _is_windows():
|
||||
# Windows requires special care
|
||||
create_no_window = 0x08000000
|
||||
Popen(portal_cmd, env=getenv(), bufsize=-1,
|
||||
|
|
@ -1349,7 +1354,7 @@ def getenv():
|
|||
env (dict): Environment global dict.
|
||||
|
||||
"""
|
||||
sep = ";" if os.name == 'nt' else ":"
|
||||
sep = ";" if _is_windows() else ":"
|
||||
env = os.environ.copy()
|
||||
env['PYTHONPATH'] = sep.join(sys.path)
|
||||
return env
|
||||
|
|
@ -1409,7 +1414,7 @@ def kill(pidfile, component='Server', callback=None, errback=None, killsignal=SI
|
|||
Ignored on Windows.
|
||||
|
||||
"""
|
||||
if os.name == 'nt':
|
||||
if _is_windows():
|
||||
# Windows signal sending is very limited.
|
||||
from win32api import GenerateConsoleCtrlEvent, SetConsoleCtrlHandler
|
||||
try:
|
||||
|
|
@ -1427,7 +1432,7 @@ def kill(pidfile, component='Server', callback=None, errback=None, killsignal=SI
|
|||
# Linux/Unix/Mac can send kill signal directly to specific PIDs.
|
||||
pid = get_pid(pidfile)
|
||||
if pid:
|
||||
if os.name == 'nt':
|
||||
if _is_windows():
|
||||
os.remove(pidfile)
|
||||
try:
|
||||
os.kill(int(pid), killsignal)
|
||||
|
|
@ -1607,7 +1612,7 @@ def init_game_directory(path, check_db=True):
|
|||
print(ERROR_LOGDIR_MISSING.format(logfiles=errstr))
|
||||
sys.exit()
|
||||
|
||||
if os.name == 'nt':
|
||||
if _is_windows():
|
||||
# We need to handle Windows twisted separately. We create a
|
||||
# batchfile in game/server, linking to the actual binary
|
||||
|
||||
|
|
@ -1754,12 +1759,12 @@ def run_menu():
|
|||
elif inp == 6:
|
||||
stop_server_only()
|
||||
elif inp == 7:
|
||||
if os.name == 'nt':
|
||||
if _is_windows():
|
||||
print("Windows can't send kill signals by PID. Use option 8 instead.")
|
||||
else:
|
||||
kill(SERVER_PIDFILE, 'Server')
|
||||
elif inp == 8:
|
||||
if os.name == 'nt':
|
||||
if _is_windows():
|
||||
kill(None)
|
||||
else:
|
||||
kill(SERVER_PIDFILE, 'Server')
|
||||
|
|
@ -1937,10 +1942,16 @@ def main():
|
|||
elif option == 'sstop':
|
||||
stop_server_only()
|
||||
elif option == 'kill':
|
||||
kill(SERVER_PIDFILE, 'Server')
|
||||
kill(PORTAL_PIDFILE, 'Portal')
|
||||
if _is_windows():
|
||||
kill(None)
|
||||
else:
|
||||
kill(SERVER_PIDFILE, 'Server')
|
||||
kill(PORTAL_PIDFILE, 'Portal')
|
||||
elif option == 'skill':
|
||||
kill(SERVER_PIDFILE, 'Server')
|
||||
if _is_windows():
|
||||
print("This is not supported on Windows. Use 'evennia kill' instead.")
|
||||
else:
|
||||
kill(SERVER_PIDFILE, 'Server')
|
||||
elif option != "noop":
|
||||
# pass-through to django manager
|
||||
check_db = False
|
||||
|
|
|
|||
|
|
@ -9,10 +9,14 @@ import sys
|
|||
from twisted.internet import protocol
|
||||
from evennia.server.portal import amp
|
||||
from django.conf import settings
|
||||
from subprocess import Popen, STDOUT, PIPE
|
||||
from subprocess import Popen, STDOUT
|
||||
from evennia.utils import logger
|
||||
|
||||
|
||||
def _is_windows():
|
||||
return os.name == 'nt'
|
||||
|
||||
|
||||
def getenv():
|
||||
"""
|
||||
Get current environment and add PYTHONPATH.
|
||||
|
|
@ -21,7 +25,7 @@ def getenv():
|
|||
env (dict): Environment global dict.
|
||||
|
||||
"""
|
||||
sep = ";" if os.name == 'nt' else ":"
|
||||
sep = ";" if _is_windows() else ":"
|
||||
env = os.environ.copy()
|
||||
env['PYTHONPATH'] = sep.join(sys.path)
|
||||
return env
|
||||
|
|
@ -156,7 +160,7 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
|
|||
# eventual errors happening before the Server has
|
||||
# opened its logger.
|
||||
try:
|
||||
if os.name == 'nt':
|
||||
if _is_windows():
|
||||
# Windows requires special care
|
||||
create_no_window = 0x08000000
|
||||
process = Popen(server_twistd_cmd, env=getenv(), bufsize=-1,
|
||||
|
|
@ -171,11 +175,10 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
|
|||
|
||||
self.factory.portal.server_twistd_cmd = server_twistd_cmd
|
||||
logfile.flush()
|
||||
if process:
|
||||
# avoid zombie-process
|
||||
if process and not _is_windows():
|
||||
# avoid zombie-process on Unix/BSD
|
||||
process.wait()
|
||||
return process.pid
|
||||
return 0
|
||||
return
|
||||
|
||||
def wait_for_disconnect(self, callback, *args, **kwargs):
|
||||
"""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue