forked from metin-server/m2dev-server
70 lines
1.7 KiB
Python
70 lines
1.7 KiB
Python
import os
|
|
import sys
|
|
import time
|
|
import json
|
|
import subprocess
|
|
import signal
|
|
import traceback
|
|
|
|
GAMEDIR = os.getcwd()
|
|
PIDS_FILE = os.path.join(GAMEDIR, "pids.json")
|
|
|
|
def print_green(text):
|
|
print("\033[1;32m" + text + "\033[0m")
|
|
|
|
def stop_pid(pid, name):
|
|
try:
|
|
if os.name == "nt":
|
|
subprocess.call(["taskkill", "/F", "/PID", str(pid)],
|
|
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
else:
|
|
os.kill(pid, signal.SIGTERM)
|
|
except ProcessLookupError:
|
|
print(f"> Process {pid} ({name}) not found, skipping.")
|
|
except Exception as e:
|
|
print(f"> Error stopping {name} (PID {pid}): {e}")
|
|
traceback.print_exc()
|
|
|
|
def kill_by_name(name):
|
|
try:
|
|
if os.name == "nt":
|
|
subprocess.call(["taskkill", "/F", "/IM", f"{name}.exe"],
|
|
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
else:
|
|
subprocess.call(["pkill", "-1", name],
|
|
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
except Exception as e:
|
|
print(f"> Error killing {name} by name: {e}")
|
|
traceback.print_exc()
|
|
|
|
def main():
|
|
try:
|
|
with open(PIDS_FILE, "r") as f:
|
|
entries = json.load(f)
|
|
except Exception as e:
|
|
print(f"> Could not read PID file: {e}")
|
|
traceback.print_exc()
|
|
sys.exit(1)
|
|
|
|
for entry in entries.get("channel", []):
|
|
name = entry.get("name")
|
|
pid = entry.get("pid")
|
|
print_green(f"> Stopping {name} (PID {pid})...")
|
|
stop_pid(pid, name)
|
|
time.sleep(0.2)
|
|
|
|
auth = entries.get("auth")
|
|
if auth:
|
|
print_green(f"> Stopping {auth.get('name')} (PID {auth.get('pid')})...")
|
|
stop_pid(auth.get('pid'), auth.get('name'))
|
|
time.sleep(1)
|
|
|
|
db = entries.get("db")
|
|
if db:
|
|
print_green(f"> Stopping {db.get('name')} (PID {db.get('pid')})...")
|
|
stop_pid(db.get('pid'), db.get('name'))
|
|
|
|
print_green("> All requested processes signaled.")
|
|
|
|
if __name__ == "__main__":
|
|
main() |