В программе/процедуре, выполняющейся в пакетном задании, требуется получить имя этого задания и его id. Казалось бы, все просто: TCB = c2d(storage(21C,4)) /* current TCB */ или "от печки" CVT = '10' /* CVT absolute address */ TCB = c2x(storage(c2x(storage(c2x(storage(CVT,4)),4)),4)) /* current TCB */ затем TIOT = c2d(storage(d2x(TCB+12),4)) JBNM = strip(storage(d2x(TIOT),8)) /* jobname */ JSCB = c2d(storage(d2x(TCB+180),4)) SSIB = c2d(storage(d2x(JSCB+316),4)) JBID = storage(d2x(SSIB+12),8) /* jobid */ Подобный код можно найти на самых разных сайтах. Но... если вызываемая программа/процедура выполняется в z/OS UNIX, например, в таком задании: //AOPBATCH EXEC PGM=AOPBATCH,REGION=0M,PARM='/sh' //STDOUT DD SYSOUT=* //STDERR DD SYSOUT=* //STDIN DD * /u/gregory/rexx_script ; // приведенный выше код не определяет jobid. Причина в том, что AOPBATCH (BPXBATCH) выполняет программу, в данном случае shell, в отдельном адресном пространстве (*OMVSEX, при выполнении задания можно заметить это, наблюдая за SDSF.DA). Так как же в таком случае найти jobid? Вопрос обсуждался здесь где предлагалось использовать такой код: tcb = C2D(STORAGE(21C,4)) /* get current TCB */ jsab = 0 /* null pointer */ if tcb \= 0 then do stcb = C2D(STORAGE(D2X(tcb+312),4)) jsab = C2D(STORAGE(D2X(stcb+188),4)) end if jsab = 0 then do ascb = C2D(STORAGE(224,4)) /* get current TCB */ assb = C2D(STORAGE(D2X(ascb+336),4)) jsab = C2D(STORAGE(D2X(assb+168),4)) end jbnm = STORAGE(D2X(jsab+28),8) jbid = STORAGE(D2X(jsab+20),8) отсюда Но этот код задачу не решает, он находит jobid BPXOINIT (т.е. STC02119 например) Так как же все-таки найти jobid в этом случае?
Может быть вот это поможет When a new address space is created as part of a fork/spawn call, USS will typically add a numeric suffix to differentiate the parent process from the child process. It only does this IF the parent process has a jobname of 7 characters or less. With a jobname of 8 characters, USS will not add a numeric suffix to the jobname.
With OMVS processes, each process has a Process ID (PID) and when a child process is created, the PID of the Parent is recorded as the PPID. You can use this Parent PID (PPID) to find the parent that started this process. Идея такая: Надо будет с помощью procinfo() определить собственный PID процесса и его родительский процесс (PPID) и затем указав в procinfo родительский процесс много чего достать, во всяком случае ASID и JOBNAME точно.
увы, этот путь ведет туда же... PPID указывает на BPXINIT. Сегодня весь день я безуспешно рылся в управляющих блоках пытаяясь найти связь между адресными пространствами -
ASCB ASID JOBNAME JOBID FACC80 28 IBMUSER0 JOB03713 <--- это задание ... F9B700 129 IBMUSER0 STC03709 <--- это spawned OMVS
А связь должна быть! В любом случае, спасибо за обсуждение! P.S. если имя исходного задания не 8 символов, а меньше, то и jobname ассоциированное со spawned OMVS не будет совпадать с оригинальным - добавляется цифра справа
Сообщение отредактировал Gregory - Вт, 12.06.2012, 18:41
Не поленился запустил некий скрипт, который подвисает на минуту Выдал команду D OMVS,A=ALL Процесс у которого PPID равен 1 и есть наш шаг задания, который вызвал в два этапа, сначала sh,а затем некий REXX скрипт rx1. То есть схема выглядит так: 1. Сначала определяем свой ASID 2. Далее через procinfo из списка процессов находим первый попавшийся процесс нашего ASID 3. Указывая в procinfo номер процесса, добираемся до процесса у которого PPID = 1. Это и будет AOPBATCH 4. Для его ASID определяем JOBID
/* REXX */ numeric digits 20 call syscalls 'ON' address syscall 'getpid' pid = retval BPXW_ASID = '' /* look for ASID of process 1 (AOPBATCH) */ do while pid <> 1 rc=procinfo(pid) pid = BPXW_PPID end /* scan ASCB's for found ASID */ CVT = c2d(storage(10,4)) CVTASVT = c2d(storage(d2x(CVT+556),4)) ASVTMAXU = c2d(storage(d2x(CVTASVT+516),4)) do i = 1 To ASVTMAXU ASCB = c2d(storage(d2x(CVTASVT+528+(i-1)*4),4)) if storage(d2x(ASCB+0),4) <> 'ASCB' then iterate i ASID = c2d(storage(d2x(ASCB+36),2)) if ASID = BPXW_ASID then do ASSB = c2d(storage(d2x(ASCB+336),4)) JSAB = c2d(storage(d2x(ASSB+168),4)) JBNM = storage(d2x(JSAB+28),8) JBID = storage(d2x(JSAB+20),8) say ASID JBNM JBID end end i
результат: 46 IBMUSER0 JOB03979, т.е. то, что и требовалось.
Не понимаю, почему у меня вчера это не получилось Спасибо!
Сообщение отредактировал Gregory - Чт, 14.06.2012, 10:45