daemon2: properly abort stuck children
This commit is contained in:
parent
1d064e0da5
commit
c90a028cdc
2 changed files with 17 additions and 10 deletions
|
@ -5895,13 +5895,6 @@
|
||||||
|
|
||||||
if($debug) _debug("Feed: " . $line["feed_url"] . ", " . $line["last_updated"]);
|
if($debug) _debug("Feed: " . $line["feed_url"] . ", " . $line["last_updated"]);
|
||||||
|
|
||||||
// We setup a alarm to alert if the feed take more than 300s to update.
|
|
||||||
// => HANG alarm.
|
|
||||||
if(!$from_http && function_exists('pcntl_alarm')) pcntl_alarm(300);
|
|
||||||
update_rss_feed($link, $line["id"], true);
|
|
||||||
// Cancel the alarm (the update went well)
|
|
||||||
if(!$from_http && function_exists('pcntl_alarm')) pcntl_alarm(0);
|
|
||||||
|
|
||||||
sleep(1); // prevent flood (FIXME make this an option?)
|
sleep(1); // prevent flood (FIXME make this an option?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,11 +17,13 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
define('PURGE_INTERVAL', 3600); // seconds
|
define('PURGE_INTERVAL', 3600); // seconds
|
||||||
|
define('MAX_CHILD_RUNTIME', 600); // seconds
|
||||||
|
|
||||||
require_once "sanity_check.php";
|
require_once "sanity_check.php";
|
||||||
require_once "config.php";
|
require_once "config.php";
|
||||||
|
|
||||||
define('MAX_JOBS', 2);
|
define('MAX_JOBS', 2);
|
||||||
|
define('SPAWN_INTERVAL', 1);
|
||||||
|
|
||||||
define('SPAWN_INTERVAL', DAEMON_SLEEP_INTERVAL);
|
define('SPAWN_INTERVAL', DAEMON_SLEEP_INTERVAL);
|
||||||
|
|
||||||
|
@ -41,6 +43,7 @@
|
||||||
error_reporting(DEFAULT_ERROR_LEVEL);
|
error_reporting(DEFAULT_ERROR_LEVEL);
|
||||||
|
|
||||||
$children = array();
|
$children = array();
|
||||||
|
$ctimes = array();
|
||||||
|
|
||||||
$last_checkpoint = -1;
|
$last_checkpoint = -1;
|
||||||
|
|
||||||
|
@ -54,6 +57,7 @@
|
||||||
array_push($tmp, $pid);
|
array_push($tmp, $pid);
|
||||||
} else {
|
} else {
|
||||||
_debug("[SIGCHLD] child $pid reaped.");
|
_debug("[SIGCHLD] child $pid reaped.");
|
||||||
|
unset($ctimes[$pid]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,8 +66,17 @@
|
||||||
return count($tmp);
|
return count($tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
function sigalrm_handler() {
|
function check_ctimes() {
|
||||||
die("[SIGALRM] hang in feed update?\n");
|
global $ctimes;
|
||||||
|
|
||||||
|
foreach (array_keys($ctimes) as $pid) {
|
||||||
|
$started = $ctimes[$pid];
|
||||||
|
|
||||||
|
if (time() - $started > MAX_CHILD_RUNTIME) {
|
||||||
|
_debug("[MASTER] child process $pid seems to be stuck, aborting...");
|
||||||
|
posix_kill($pid, SIGINT);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function sigchld_handler($signal) {
|
function sigchld_handler($signal) {
|
||||||
|
@ -79,7 +92,6 @@
|
||||||
die("[SIGINT] removing lockfile and exiting.\n");
|
die("[SIGINT] removing lockfile and exiting.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
pcntl_signal(SIGALRM, 'sigalrm_handler');
|
|
||||||
pcntl_signal(SIGCHLD, 'sigchld_handler');
|
pcntl_signal(SIGCHLD, 'sigchld_handler');
|
||||||
|
|
||||||
if (file_is_locked("update_daemon.lock")) {
|
if (file_is_locked("update_daemon.lock")) {
|
||||||
|
@ -128,6 +140,7 @@
|
||||||
|
|
||||||
if ($last_checkpoint + SPAWN_INTERVAL < time()) {
|
if ($last_checkpoint + SPAWN_INTERVAL < time()) {
|
||||||
|
|
||||||
|
check_ctimes();
|
||||||
reap_children();
|
reap_children();
|
||||||
|
|
||||||
for ($j = count($children); $j < MAX_JOBS; $j++) {
|
for ($j = count($children); $j < MAX_JOBS; $j++) {
|
||||||
|
@ -137,6 +150,7 @@
|
||||||
} else if ($pid) {
|
} else if ($pid) {
|
||||||
_debug("[MASTER] spawned client $j [PID:$pid]...");
|
_debug("[MASTER] spawned client $j [PID:$pid]...");
|
||||||
array_push($children, $pid);
|
array_push($children, $pid);
|
||||||
|
$ctimes[$pid] = time();
|
||||||
} else {
|
} else {
|
||||||
pcntl_signal(SIGCHLD, SIG_IGN);
|
pcntl_signal(SIGCHLD, SIG_IGN);
|
||||||
pcntl_signal(SIGINT, SIG_DFL);
|
pcntl_signal(SIGINT, SIG_DFL);
|
||||||
|
|
Loading…
Reference in a new issue