'Run the updater continuously.'

def run_forever(self, *args, **kwargs):

    time.sleep((random() * self.interval))
    while True:
        self.logger.info(_('Begin    object    update    sweep'))
        begin = time.time()
        pids = []
        self.get_container_ring().get_nodes('')
        for device in self._listdir(self.devices):
            if (self.mount_check and (not ismount(os.path.join(self.devices, device)))):
                self.logger.increment('errors')
                self.logger.warning(_('Skipping    %s    as    it    is    not    mounted'), device)
                continue
            while (len(pids) >= self.concurrency):
                pids.remove(os.wait()[0])
            pid = os.fork()
            if pid:
                pids.append(pid)
            else:
                signal.signal(signal.SIGTERM, signal.SIG_DFL)
                patcher.monkey_patch(all=False, socket=True, select=True, thread=True)
                self.successes = 0
                self.failures = 0
                forkbegin = time.time()
                self.object_sweep(os.path.join(self.devices, device))
                elapsed = (time.time() - forkbegin)
                self.logger.info(_('Object    update    sweep    of    %(device)s    completed:    %(elapsed).02fs,    %(success)s    successes,    %(fail)s    failures'), {'device': device, 'elapsed': elapsed, 'success': self.successes, 'fail': self.failures})
                sys.exit()
        while pids:
            pids.remove(os.wait()[0])
        elapsed = (time.time() - begin)
        self.logger.info(_('Object    update    sweep    completed:    %.02fs'), elapsed)
        dump_recon_cache({'object_updater_sweep': elapsed}, self.rcache, self.logger)
        if (elapsed < self.interval):
            time.sleep((self.interval - elapsed))
