source: ogAgent-Git/src/opengnsys/jobmgr.py @ 6740704

browser-nuevodecorare-oglive-methodsexec-ogbrowserfix-urlfixes-winlgromero-filebeatlog-sess-lenmainmodulesnew-browserno-ptt-paramno-tlsogadmcliogadmclient-statusogagent-jobsogagentuser-sigtermogcore1oggitoggit-notlsoglogoglog2override-moduleping1ping2ping3ping4report-progresssched-tasktlstls-againunification2unification3
Last change on this file since 6740704 was da7dd41, checked in by Natalia Serrano <natalia.serrano@…>, 10 months ago

refs #500 fix portability issue

  • Property mode set to 100644
File size: 2.1 KB
Line 
1import threading
2import subprocess
3import hashlib
4from datetime import datetime, timezone
5from opengnsys import operations
6from opengnsys.log import logger
7
8def job_readstdout(job):
9    for l in iter(job['p'].stdout.readline, b''):
10        job['stdout'] += l.decode ('utf-8', 'ignore')
11
12def job_readstderr(job):
13    for l in iter(job['p'].stderr.readline, b''):
14        job['stderr'] += l.decode ('utf-8', 'ignore')
15
16class JobMgr():
17    jobs = {}
18
19    def launch_job(self, script, is_client):
20        logger.debug ('in launch_job(), is_client "{}"'.format(is_client))
21        args = operations.build_popen_args (script)
22        logger.debug ('args "{}"'.format (args))
23        now = datetime.now (tz=timezone.utc)
24        ts = now.strftime ('%Y-%m-%d %H:%M:%S.%f%z')    ## '%s' doesn't work on windows
25        jobid = hashlib.sha256 (now.isoformat().encode('UTF-8') + script.encode ('UTF-8')).hexdigest()[0:8]
26        p = subprocess.Popen (args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
27        self.jobs[jobid] = { 'p': p, 'pid': p.pid, 'starttime': ts, 'script': script, 'client': is_client, 'status': 'running', 'stdout': '', 'stderr': '' }
28        self.jobs[jobid]['t1'] = threading.Thread (target=job_readstdout, args=(self.jobs[jobid],))
29        self.jobs[jobid]['t2'] = threading.Thread (target=job_readstderr, args=(self.jobs[jobid],))
30        self.jobs[jobid]['t1'].start()
31        self.jobs[jobid]['t2'].start()
32        logger.debug ('jobs "{}"'.format (self.jobs))
33        return jobid
34
35    def prepare_jobs(self):
36        ## can't return self.jobs because the Popen object at self.jobs[id]['p'] is not serializable. So, need to create a new dict to return
37        st = {}
38        for jobid in self.jobs:
39            j = self.jobs[jobid]
40            st[jobid] = dict ((k, j[k]) for k in ['pid', 'starttime', 'script', 'client', 'status', 'stdout', 'stderr'])
41            if j['p'].poll() is not None:    ## process finished
42                st[jobid]['rc'] = j['p'].returncode
43                st[jobid]['status'] = 'finished'
44        return st
45
46    #def kill_job(self, jobid):
47    #    self.jobs[jobid]['p'].kill()
Note: See TracBrowser for help on using the repository browser.