]> git.mxchange.org Git - friendica.git/commitdiff
Reworked the pidfile class
authorMichael <heluecht@pirati.ca>
Sat, 9 Dec 2017 17:49:11 +0000 (17:49 +0000)
committerMichael <heluecht@pirati.ca>
Sat, 9 Dec 2017 17:49:11 +0000 (17:49 +0000)
src/Util/ExAuth.php
src/Util/Pidfile.php

index 973969678b8047d795c865dcc7e255fbe29ca903..f83901e98974e527041c7af0b1aa169ddcb5752b 100644 (file)
@@ -46,7 +46,6 @@ class ExAuth
 {
        private $bDebug;
        private $host;
-       private $pidfile;
 
        /**
         * @brief Create the class
@@ -313,21 +312,18 @@ class ExAuth
                        return;
                }
 
-               $this->pidfile = new Pidfile($lockpath, $host);
-               if ($this->pidfile->isRunning()) {
-                       $oldpid = $this->pidfile->pid();
-                       $this->writeLog(LOG_INFO, 'Process ' . $oldpid . ' was running for ' . $this->pidfile->runningTime() . ' seconds and will now be killed');
-                       $this->pidfile->kill();
-
-                       // Wait until the other process is hopefully killed
-                       sleep(2);
-
-                       $this->pidfile = new Pidfile($lockpath, $host);
-                       if ($oldpid == $this->pidfile->pid()) {
-                               $this->writeLog(LOG_ERR, 'Process ' . $oldpid . "wasn't killed in time. We now quit our process.");
+               $file = $lockpath . DIRECTORY_SEPARATOR . $host;
+               if (Pidfile::isRunningProcess($file)) {
+                       if (PidFile::killProcess($file)) {
+                               $this->writeLog(LOG_INFO, 'Old process was successfully killed');
+                       } else {
+                               $this->writeLog(LOG_ERR, "The old Process wasn't killed in time. We now quit our process.");
                                die();
                        }
                }
+
+               // Now it is safe to create the pid file
+               Pidfile::create($file);
        }
 
        /**
index 6d940c646905bfbfce0f68cdbd62a335c01eff93..9d12b0bd25232e15df2589977b691bca0cce34eb 100644 (file)
@@ -9,78 +9,100 @@ namespace Friendica\Util;
  */
 class Pidfile
 {
-       private $file;
-       private $running;
-       private $pid;
-
        /**
-        * @param string $dir  path
-        * @param string $name filename
-        * @return void
+        * @brief Read the pid from a given pid file
+        *
+        * @param string $file Filename of pid file
+        *
+        * @return boolean|string PID or "false" if not existent
         */
-       public function __construct($dir, $name)
-       {
-               $this->file = "$dir/$name";
-               $this->running = false;
-
-               if (file_exists($this->file)) {
-                       $this->pid = trim(@file_get_contents($this->file));
-                       if (($this->pid != "") && posix_kill($this->pid, 0)) {
-                               $this->running = true;
-                       }
+       static private function pidFromFile($file) {
+               if (!file_exists($file)) {
+                       return false;
                }
 
-               if (!$this->running) {
-                       $this->pid = getmypid();
-                       file_put_contents($this->file, $this->pid);
-               }
+               return trim(@file_get_contents($file));
        }
 
        /**
-        * @return void
+        * @brief Is there a running process with the given pid file
+        *
+        * @param string $file Filename of pid file
+        *
+        * @return boolean Is it running?
         */
-       public function __destruct()
-       {
-               if (!$this->running && file_exists($this->file)) {
-                       @unlink($this->file);
+       static public function isRunningProcess($file) {
+               $pid = self::pidFromFile($file);
+
+               if (!$pid) {
+                       return false;
                }
-       }
 
-       /**
-        * @brief Check if a process with this pid file is already running
-        * @return boolean Is it running?
-        */
-       public function isRunning()
-       {
-               return $this->running;
+               // Is the process running?
+               $running = posix_kill($pid, 0);
+
+               // If not, then we will kill the stale file
+               if (!$running) {
+                       self::delete($file);
+               }
+               return $running;
        }
 
        /**
-        * @brief Return the pid of the process
-        * @return boolean process id
+        * @brief Kills a process from a given pid file
+        *
+        * @param string $file Filename of pid file
+        *
+        * @return boolean Was it killed successfully?
         */
-       public function pid()
-       {
-               return $this->pid;
+       static public function killProcess($file) {
+               $pid = self::pidFromFile($file);
+
+               // We don't have a process id? then we quit
+               if (!$pid) {
+                       return false;
+               }
+
+               // We now kill the process
+               $killed = posix_kill($pid, SIGTERM);
+
+               // If we killed the process successfully, we can remove the pidfile
+               if ($killed) {
+                       self::delete($file);
+               }
+               return $killed;
        }
 
        /**
-        * @brief Returns the seconds that the old process was running
-        * @return integer run time of the old process
+        * @brief Creates a pid file
+        *
+        * @param string $file Filename of pid file
+        *
+        * @return boolean|string PID or "false" if not created
         */
-       public function runningTime()
-       {
-               return time() - @filectime($this->file);
+       static public function create($file) {
+               $pid = self::pidFromFile($file);
+
+               // We have a process id? then we quit
+               if ($pid) {
+                       return false;
+               }
+
+               $pid = getmypid();
+               file_put_contents($file, $pid);
+
+               // Now we check if everything is okay
+               return self::pidFromFile($file);
        }
 
        /**
-        * @brief Kills the old process
-        * @return boolean
+        * @brief Deletes a given pid file
+        *
+        * @param string $file Filename of pid file
+        *
+        * @return boolean Is it running?
         */
-       public function kill()
-       {
-               if (!empty($this->pid)) {
-                       return posix_kill($this->pid, SIGTERM);
-               }
+       static public function delete($file) {
+               return @unlink($file);
        }
 }