diff --git a/util/daemon.php b/util/daemon.php new file mode 100644 index 0000000000..d1eb70d8b1 --- /dev/null +++ b/util/daemon.php @@ -0,0 +1,96 @@ +<?php +/* +Run the poller from a daemon. +This script was taken from http://php.net/manual/en/function.pcntl-fork.php +*/ +function shutdown() { + posix_kill(posix_getpid(), SIGHUP); +} + +if (in_array("start", $_SERVER["argv"])) { + $mode = "start"; +} + +if (in_array("stop", $_SERVER["argv"])) { + $mode = "stop"; +} + +if (in_array("status", $_SERVER["argv"])) { + $mode = "status"; +} + +if (!isset($mode)) { + die("Please use either 'start', 'stop' or 'status'.\n"); +} + +@include(".htconfig.php"); + +if (!isset($pidfile)) { + die('Please specify a pid file in the variable $pidfile in the .htconfig.php. For example:'."\n". + '$pidfile = "/path/to/daemon.pid";'."\n"); +} + +if (in_array($mode, array("stop", "status"))) { + $pid = @file_get_contents($pidfile); + + if (!$pid) { + die("Pidfile wasn't found. Is the daemon running?\n"); + } +} + +if ($mode == "status") { + if (posix_kill($pid, 0)) { + die("Daemon process $pid is running.\n"); + } + + unlink($pidfile); + + die("Daemon process $pid isn't running.\n"); +} + +if ($mode == "stop") { + posix_kill($pid, SIGTERM); + + unlink($pidfile); + + die("Worker daemon process $pid was killed.\n"); +} + +echo "Starting worker daemon.\n"; + +if (isset($a->config['php_path'])) { + $php = $a->config['php_path']; +} else { + $php = "php"; +} + +// Switch over to daemon mode. +if ($pid = pcntl_fork()) + return; // Parent + +fclose(STDIN); // Close all of the standard +fclose(STDOUT); // file descriptors as we +fclose(STDERR); // are running as a daemon. + +register_shutdown_function('shutdown'); + +if (posix_setsid() < 0) + return; + +if ($pid = pcntl_fork()) + return; // Parent + +$pid = getmypid(); +file_put_contents($pidfile, $pid); + +// Now running as a daemon. +while (true) { + // Call the poller + $cmdline = $php.' include/poller.php'; + + exec($cmdline); + + // Now sleep for 5 minutes + sleep(300); +} +?>