mirror of
https://code.mensbeam.com/MensBeam/Arsse.git
synced 2024-12-22 13:12:41 +00:00
Separate PID conflict checking from PID claiming
This commit is contained in:
parent
822158d1bd
commit
bab64add9b
1 changed files with 29 additions and 25 deletions
|
@ -74,40 +74,44 @@ class Daemon {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function checkPID(string $pidfile, bool $lock) {
|
protected function checkPID(string $pidfile) {
|
||||||
if (!$lock) {
|
if (file_exists($pidfile)) {
|
||||||
if (file_exists($pidfile)) {
|
$pid = @file_get_contents($pidfile);
|
||||||
$pid = @file_get_contents($pidfile);
|
if (preg_match("/^\d+$/s", (string) $pid)) {
|
||||||
|
if ($this->processExists((int) $pid)) {
|
||||||
|
throw new \Exception("Process already exists");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function writePID(string $pidfile): void {
|
||||||
|
if ($f = @fopen($pidfile, "c+")) {
|
||||||
|
if (@flock($f, \LOCK_EX | \LOCK_NB)) {
|
||||||
|
// confirm that some other process didn't get in before us
|
||||||
|
$pid = fread($f, 100);
|
||||||
if (preg_match("/^\d+$/s", (string) $pid)) {
|
if (preg_match("/^\d+$/s", (string) $pid)) {
|
||||||
if (@posix_kill((int) $pid, 0)) {
|
if ($this->processExists((int) $pid)) {
|
||||||
throw new \Exception("Process already exists");
|
throw new \Exception("Process already exists");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// write the PID to the pidfile
|
||||||
|
rewind($f);
|
||||||
|
ftruncate($f, 0);
|
||||||
|
fwrite($f, (string) posix_getpid());
|
||||||
|
fclose($f);
|
||||||
|
} else {
|
||||||
|
throw new \Exception("Process already exists");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($f = @fopen($pidfile, "c+")) {
|
throw new \Exception("Could not write to PID file");
|
||||||
if (@flock($f, \LOCK_EX | \LOCK_NB)) {
|
|
||||||
// confirm that some other process didn't get in before us
|
|
||||||
$pid = fread($f, 100);
|
|
||||||
if (preg_match("/^\d+$/s", (string) $pid)) {
|
|
||||||
if (@posix_kill((int) $pid, 0)) {
|
|
||||||
throw new \Exception("Process already exists");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// write the PID to the pidfile
|
|
||||||
rewind($f);
|
|
||||||
ftruncate($f, 0);
|
|
||||||
fwrite($f, (string) posix_getpid());
|
|
||||||
fclose($f);
|
|
||||||
} else {
|
|
||||||
throw new \Exception("Process already exists");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new Exception("Could not write to PID file");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function processExists(int $pid): bool {
|
||||||
|
return @posix_kill($pid, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/** Resolves the PID file path and ensures the file or parent directory is writable */
|
/** Resolves the PID file path and ensures the file or parent directory is writable */
|
||||||
public function checkPIDFilePath(string $pidfile): string {
|
public function checkPIDFilePath(string $pidfile): string {
|
||||||
$dir = dirname($pidfile);
|
$dir = dirname($pidfile);
|
||||||
|
|
Loading…
Reference in a new issue