def __init__(self, task_directory, course_factory, task_factory, ssh_manager_location, tmp_dir="./agent_tmp"): """ :param task_directory: :param course_factory: :param task_factory: :param ssh_manager_location: port or filename(unix socket) to bind to. If None, remote debugging is deactivated :param tmp_dir: :return: """ from inginious.backend.agent._cgroup_helper import CGroupTimeoutWatcher, CGroupMemoryWatcher self.logger.info("Starting agent") self.image_aliases = [] self.tmp_dir = tmp_dir self.task_directory = task_directory self.course_factory = course_factory self.task_factory = task_factory # Delete tmp_dir, and recreate-it again try: rmtree(tmp_dir) except: pass try: os.mkdir(tmp_dir) except OSError: pass # Assert that the folders are *really* empty self._force_directory_empty(tmp_dir) if ssh_manager_location is not None: self.remote_ssh_manager = RemoteSSHManager(ssh_manager_location) else: self.remote_ssh_manager = None self.logger.debug("Start cgroup helper") self._timeout_watcher = CGroupTimeoutWatcher() self._memory_watcher = CGroupMemoryWatcher() self._timeout_watcher.start() self._memory_watcher.start() # Init the internal job count, used to name the directories self._internal_job_count_lock = threading.Lock() self._internal_job_count = 0 # Dict that stores running container ids for each job id self._container_for_job = {} # Stores container id of killed containers self._killed_containers = set()