Просмотр исходного кода

Check and create PID file in a race-free manner

Unrud 10 лет назад
Родитель
Сommit
3a9238f670
1 измененных файлов с 11 добавлено и 4 удалено
  1. 11 4
      radicale/__main__.py

+ 11 - 4
radicale/__main__.py

@@ -99,13 +99,20 @@ def run():
 
     # Fork if Radicale is launched as daemon
     if config.getboolean("server", "daemon"):
-        if os.path.exists(config.get("server", "pid")):
-            raise OSError("PID file exists: %s" % config.get("server", "pid"))
+        # Check and create PID file in a race-free manner
+        if config.get("server", "pid"):
+            try:
+                pid_fd = os.open(config.get("server", "pid"),
+                                 os.O_CREAT | os.O_EXCL | os.O_WRONLY)
+            except:
+                raise OSError("PID file exists: %s" %
+                              config.get("server", "pid"))
         pid = os.fork()
         if pid:
             sys.exit()
-        elif config.get("server", "pid"):
-            with open(config.get("server", "pid"), "w") as pid_file:
+        # Write PID
+        if config.get("server", "pid"):
+            with os.fdopen(pid_fd, "w") as pid_file:
                 pid_file.write(str(os.getpid()))
         sys.stdout = sys.stderr = open(os.devnull, "w")