-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsync_daemon.py
More file actions
48 lines (38 loc) · 1.6 KB
/
Copy pathsync_daemon.py
File metadata and controls
48 lines (38 loc) · 1.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
"""Фоновый демон синхронизации Mailru Cloud.
Запускается в отдельном процессе командой `mailrucloud start`.
Каждую минуту синхронизирует каталог `~/Mail.Cloud` с корнем облака `/`.
"""
from pathlib import Path
import signal
import sys
import time
import os
from sync import sync_directories
RUNNING = True
def _signal_handler(signum, frame):
global RUNNING
RUNNING = False
signal.signal(signal.SIGTERM, _signal_handler)
# SIGINT полезен при отладке через Ctrl+C, но в проде процесс будет в фоне.
signal.signal(signal.SIGINT, _signal_handler)
LOCAL_DIR = str(Path.home() / "Mail.Cloud")
REMOTE_DIR = "/"
INTERVAL_SEC = 60 # частота синхронизации
PID_FILE = str(Path.home() / ".mailrucloud-daemon.pid")
if __name__ == "__main__":
Path(LOCAL_DIR).mkdir(exist_ok=True)
# Записываем PID в файл
with open(PID_FILE, "w") as f:
f.write(str(os.getpid()))
try:
while RUNNING:
try:
sync_directories(LOCAL_DIR, REMOTE_DIR, direction="both")
except Exception as exc:
# Логируем ошибку в stderr, но продолжаем работу
print(f"[sync-daemon] Ошибка синхронизации: {exc}", file=sys.stderr, flush=True)
time.sleep(INTERVAL_SEC)
finally:
# Удаляем PID-файл при завершении
if os.path.exists(PID_FILE):
os.remove(PID_FILE)