LiveHouse-TS / scripts /daemon_service.py
ziyuzhou02's picture
Deploy GitHub main 3feb6cda1511
e317359 verified
Raw
History Blame Contribute Delete
2.12 kB
#!/usr/bin/env python3
"""Start/stop only this checkout's daemon; retain the lock inode across restarts."""
from __future__ import annotations
import os
from pathlib import Path
import signal
import subprocess
import sys
import time
ROOT = Path(__file__).resolve().parents[1]
PID_FILE = ROOT / ".daemon.pid"
def owned_process(pid: int, root: Path = ROOT) -> bool:
result = subprocess.run(
["ps", "-p", str(pid), "-o", "command="], capture_output=True, text=True
)
return str(root / "scripts/run_online_daemon.py") in result.stdout
def main() -> int:
action = sys.argv[1]
pid = int(PID_FILE.read_text().strip()) if PID_FILE.exists() else None
if action == "stop":
if pid and owned_process(pid):
os.kill(pid, signal.SIGTERM)
for _ in range(30):
if not owned_process(pid):
break
time.sleep(1)
else:
raise SystemExit(
"Daemon has not stopped; inspect its log before restarting."
)
print(f"Stopped this checkout daemon ({pid}).")
else:
print("No running daemon owned by this checkout.")
PID_FILE.unlink(missing_ok=True)
return 0
if pid and owned_process(pid):
print(f"Already running ({pid}).")
return 0
(ROOT / "logs").mkdir(exist_ok=True)
with (ROOT / "logs/online_daemon.log").open("a") as log:
process = subprocess.Popen(
[sys.executable, str(ROOT / "scripts/run_online_daemon.py"), *sys.argv[2:]],
cwd=ROOT,
stdin=subprocess.DEVNULL,
stdout=log,
stderr=log,
start_new_session=True,
)
PID_FILE.write_text(f"{process.pid}\n")
time.sleep(2)
if process.poll() is not None:
PID_FILE.unlink(missing_ok=True)
print("Daemon exited; inspect logs/online_daemon.log.", file=sys.stderr)
return 1
print(f"Started ({process.pid}); logs/online_daemon.log; stop with ./stop.sh")
return 0
if __name__ == "__main__":
raise SystemExit(main())