1
1
Fork 0
mirror of https://code.mensbeam.com/MensBeam/Arsse.git synced 2024-12-22 21:22:40 +00:00

Separate PID conflict checking from PID claiming

This commit is contained in:
J. King 2021-06-17 14:40:21 -04:00
parent 822158d1bd
commit bab64add9b

View file

@ -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);